C ++消耗delphi DLL

时间:2013-04-02 14:44:19

标签: c++ delphi dll widestring

我无法使用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);
}

1 个答案:

答案 0 :(得分:11)

你几乎没有机会调用这个功能。

首先,由于我假设stringstd::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&);