Для разработки внешней компоненты будем использовать 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;
}