2

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

1 回答 1

11

您调用该函数的机会很小。

首先,您当前的代码无法成功,因为我认为stringstd::string. 这是 Delphi 代码无法提供或使用的 C++ 数据类型。要与 Delphi 匹配,WideString您需要使用 COMBSTR数据类型。

您的代码存在的另一个问题是它cdecl在 C++ 端和stdcallDelphi 端使用。您需要调整调用约定。

但是,由于 Delphi 的返回值 ABI 与平台标准之间的差异,这也会失败。此处详细介绍了该主题:为什么不能将 WideString 用作互操作的函数返回值?

最好的办法是停止WideString用作返回值并将其转换为 C++ 引用参数。您需要将 Delphi 转换为匹配。

你正在看这样的东西:

德尔福

procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;

C++

typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);
于 2013-04-02T14:47:53.070 回答