C ++, потребляющий Delphi DLL

Я не могу использовать функцию DLL, разработанную в Delphi. У меня есть некоторые трудности с преобразованием типов.

Это функция, которую я хочу вызвать DLL:

function rData(ID: Cardinal; queue: WideString): WideString; stdcall;

Мой код на C ++ был таким:

typedef string (*ReturnDataSPL)(DWORD, string);

string result;
HMODULE hLib;
hLib = LoadLibrary("delphi.dll");
pReturnDataSPL = (ReturnDataSPL)GetProcAddress(hLib,"rData");
if (NULL != pReturnDataSPL)
result = pReturnDataSPL(JobID,printerName);

Проблема в том, что я не могу заставить ее работать. Я не знаю, какой тип совместим с Delphi WideString и Cardinal.

Кто-нибудь Помогите мне

РЕДАКТИРОВАТЬ:

Это функция, которую я хочу вызвать DLL:

procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;

После изменения кода это выглядело так:

typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);

HMODULE hLib;
BSTR result = NULL;
hLib = LoadLibrary("delphi.dll");

pReturnDataSPL = (ReturnDataSPL)GetProcAddress(hLib,"rData");
if (NULL != pReturnDataSPL)
{
pReturnDataSPL(JobID,(BSTR)"Lexmark X656de (MS) (Copiar 2)",result);
}

2

Решение

У вас очень мало шансов вызвать эту функцию.

Для начала ваш текущий код не может надеяться на успех, так как я полагаю string является std::string, Это тип данных C ++, который Delphi-код не может ни предоставлять, ни потреблять. Чтобы противостоять Delphi’s WideString вам нужно использовать COM BSTR тип данных.

Еще одна проблема с вашим кодом в том виде, в каком он есть cdecl на стороне C ++ и stdcall на стороне Delphi. Вам нужно будет согласовать соглашения о вызовах.

Однако это также не удастся из-за разницы между ABI Delphi для возвращаемых значений и стандартом платформы. Эта тема была подробно освещена здесь: Почему WideString не может использоваться как возвращаемое значение функции для взаимодействия?

Лучше всего прекратить использование WideString в качестве возвращаемого значения и преобразовать его в ссылочный параметр C ++. Вы хотите конвертировать Delphi, чтобы соответствовать.

Вы смотрите на что-то вроде этого:

Delphi

procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;

C ++

typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);
11

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

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

По вопросам рекламы [email protected]