我无法使用delphi中开发的dll的功能。我对类型的转换遇到了一些困难。
这是我想要调用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); }
答案 0 :(得分:11)
你几乎没有机会调用这个功能。
首先,由于我假设string
为std::string
,您当前的代码无法成功。这是Delphi代码无法提供或使用的C ++数据类型。要与Delphi的WideString
匹配,您需要使用COM BSTR
数据类型。
代码的另一个问题是它在C ++端使用cdecl
,在Delphi端使用stdcall
。您需要调整调用约定。
但是,由于Delphi的返回值ABI与平台标准不同,这也会失败。这个主题在这里详细介绍:Why can a WideString not be used as a function return value for interop?
最好的办法是停止使用WideString
作为返回值并将其转换为C ++引用参数。你想要将Delphi转换为匹配。
你正在看这样的事情:
<强>的Delphi 强>
procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;
<强> C ++ 强>
typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);