Создание внешних компонент 1С NativeAPI на C++. Часть 1

Для разработки внешней компоненты будем использовать Microsoft Visual Studio 2022. Создадим новый проект DLL.

При создании будем опираться на инструкцию от фирмы 1С

Добавляем функцию GetClassNames:

После добавления функции сразу видим ошибку, что WCHAR_T не известен. Чтобы исправить добавляем запись

define WCHAR_T wchar_t
typedef unsigned int       uint32_t;

Добавим еще записи include:

#include <string.h>
#include <locale.h>

В нашей функции вызывается вспомогательная, добавим ее тоже в конце файла.

uint32_t convToShortWchar(WCHAR_T** Dest, const wchar_t* Source, uint32_t len)
{
    if (!len)
        len = ::wcslen(Source) + 1;

    if (!*Dest)
        *Dest = new WCHAR_T[len];

    WCHAR_T* tmpShort = *Dest;
    wchar_t* tmpWChar = (wchar_t*)Source;
    uint32_t res = 0;

    ::memset(*Dest, 0, len * sizeof(WCHAR_T));
    do
    {
        *tmpShort++ = (WCHAR_T)*tmpWChar++;
        ++res;
    } while (len-- && *tmpWChar);

    return res;
}

А также объявление функции после блока typedef

uint32_t convToShortWchar(WCHAR_T** Dest, const wchar_t* Source, uint32_t len = 0);

Пробуем собрать проект. Итоговый текст модуля:

// Component.cpp : Определяет экспортируемые функции для DLL.
//

#include "pch.h"
#include "framework.h"
#include "Component.h"

#include <string.h>
#include <locale.h>

#define WCHAR_T     wchar_t
typedef unsigned int       uint32_t;

uint32_t convToShortWchar(WCHAR_T** Dest, const wchar_t* Source, uint32_t len = 0);

// Пример экспортированной переменной
COMPONENT_API int nComponent=0;

// Пример экспортированной функции.
COMPONENT_API int fnComponent(void)
{
    return 0;
}

// Конструктор для экспортированного класса.
CComponent::CComponent()
{
    return;
}

static const wchar_t g_kClassNames[] = L"C1CGetImageFragment";

const WCHAR_T* GetClassNames()
{
    static WCHAR_T* names = 0;
    if (!names)
        ::convToShortWchar(&names, g_kClassNames);
    return names;
}

uint32_t convToShortWchar(WCHAR_T** Dest, const wchar_t* Source, uint32_t len)
{
    if (!len)
        len = ::wcslen(Source) + 1;

    if (!*Dest)
        *Dest = new WCHAR_T[len];

    WCHAR_T* tmpShort = *Dest;
    wchar_t* tmpWChar = (wchar_t*)Source;
    uint32_t res = 0;

    ::memset(*Dest, 0, len * sizeof(WCHAR_T));
    do
    {
        *tmpShort++ = (WCHAR_T)*tmpWChar++;
        ++res;
    } while (len-- && *tmpWChar);

    return res;
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*

code