Передача PChar из Delphi DLL в C

В настоящее время у меня возникают проблемы с динамическим импортом DLL-библиотеки Delphi.
Функция DLL Delphi объявлена ​​как здесь:

function TEST() : PChar; cdecl;
begin
Result := '321 Test 123';
end;

В C ++ я называю это так:

typedef char *TestFunc(void);
TestFunc* Function;
HINSTANCE hInstLibrary = LoadLibrary("Test.dll");
if (hInstLibrary)
{
Function = (TestFunc*)GetProcAddress(hInstLibrary, "TEST");
if (Function)
{
printf("%s", Function());
}
}

Проблема в том, что я получаю только первую букву строки.
Как я могу сказать C ++, что строка не заканчивается после первого символа?

Спасибо

2

Решение

У вас есть две проблемы:

  1. Строка, которую Delphi отправляет вам, имеет кодировку UTF-16. Вам нужно будет закодировать как ANSI и вернуть PAnsiChar, если вы хотите, чтобы против char*,
  2. Память, на которую ссылается возвращенный указатель, может быть освобождена при возврате из функции. Вы получаете это в своей функции, так как возвращаете строковый литерал, который хранится как глобальная константа, которая действует в течение всего времени жизни DLL. Для строковой переменной вы столкнетесь с ошибками во время выполнения, когда ваш вызывающий попытается прочитать память, которая была освобождена. Чтобы запутать вопросы, эти ошибки во время выполнения будут прерывистыми. Ваш код может показаться работающим. Ожидайте сбои при развертывании у вашего самого важного клиента!

Ваши варианты решения пункта 2:

  1. Сделайте так, чтобы вызывающий объект выделил буфер, который затем может быть заполнен вызываемым.
  2. Выделите и освободите строку в общей куче. Например, куча COM с CoTaskMemAlloc а также CoTaskMemFree, Использование общей кучи позволяет выделить в одном модуле, а освободить в другом.

Как правило, всегда предпочитайте вариант 1, если он может удовлетворить ваши потребности.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector