C++消耗delphi DLL

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的函数:

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);
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 11

你很少有机会调用这个功能.

首先,你的当前代码不能希望成功,因为我认为stringstd::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)

  • 你的C++代码与我的不符.第三个参数必须通过引用传递.比较你的代码和我的代码之间的差异.此外,你不能只是存在BSTR.你必须做一个真正的BSTR! (2认同)