Я не могу использовать функцию 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); }
У вас очень мало шансов вызвать эту функцию.
Для начала ваш текущий код не может надеяться на успех, так как я полагаю 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&);
Других решений пока нет …