msa*_*ago 2 c++ delphi dll widestring
我无法使用delphi中开发的dll的功能.我在类型的转换方面遇到了一些困难.
这是我想调用DLL的函数:
function rData(ID: Cardinal; queue: WideString): WideString; stdcall;
Run Code Online (Sandbox Code Playgroud)
我在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);
Run Code Online (Sandbox Code Playgroud)
问题我无法使其发挥作用.我不知道哪种类型与Delphi WideString和Cardinal兼容.
谁来帮帮我
编辑:
这是我想调用DLL的函数:
Run Code Online (Sandbox Code Playgroud)procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;更改代码后看起来像这样:
Run Code Online (Sandbox Code Playgroud)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); }
Dav*_*nan 11
你很少有机会调用这个功能.
首先,你的当前代码不能希望成功,因为我认为string是std::string.这是Delphi代码无法提供或使用的C++数据类型.要与Delphi相匹配,WideString您需要使用COM BSTR数据类型.
您的代码的另一个问题是它cdecl在C++端和stdcallDelphi端使用.您需要调整调用约定.
但是,由于Delphi的返回值ABI与平台标准不同,这也会失败.这里详细介绍了这个主题:为什么WideString不能用作互操作的函数返回值?
最好的办法是停止使用WideString返回值并将其转换为C++引用参数.你想要将Delphi转换为匹配.
你正在看这样的事情:
德尔福
procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;
Run Code Online (Sandbox Code Playgroud)
C++
typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);
Run Code Online (Sandbox Code Playgroud)