C ++消费delphi DLL [英] C++ consuming delphi DLL
问题描述
我无法使用在delphi中开发的dll的功能。我对类型的转换有些困难。
I'm not able to use the function of a dll developed in delphi. I'm having some difficulties with the conversions of types.
这是我要调用DLL的函数:
This is the function I want to call the DLL:
function rData(ID: Cardinal; queue: WideString): WideString; stdcall;
我在C ++中的代码是:
My code in C++ was so:
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兼容。
The problem I'm not able to make it work. I do not know which type is compatible with Delphi WideString and Cardinal.
有人帮我
EDIT:
这是我要调用DLL的函数:
This is the function I want to call the 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);
}
推荐答案
<
为了开始您当前的代码不能希望成功,因为我假设 string
是 std :: string
。这是Delphi代码不能提供或消费的C ++数据类型。要匹配Delphi的 WideString
,您需要使用COM BSTR
数据类型。
For a start your current code can't hope to succeed since I presume string
is std::string
. That's a C++ data type which Delphi code cannot either provide or consume. To match up against Delphi's WideString
you need to use the COM BSTR
data type.
您的代码的另一个问题是它在C ++端使用 cdecl
,而 stdcall
在Delphi端。您将需要调整调用约定。
Another problem with your code as it stands is that it uses cdecl
in the C++ side, and stdcall
on the Delphi side. You'll need to align the calling conventions.
但是,这也将失败,因为Delphi的ABI返回值和平台标准之间的差异。该主题在此详细讨论:为什么不能将WideString用作interop的函数返回值?
However, that will also fail because of a difference between Delphi's ABI for return values, and the platform standard. That topic was covered in detail here: Why can a WideString not be used as a function return value for interop?
最好的办法是停止使用 WideString
作为返回值,并将其转换为C ++参考参数。
Your best bet is to stop using WideString
as a return value and convert it into a C++ reference parameter. You'll want to convert the Delphi to match.
您正在查找类似如下的内容:
You are looking at something like this:
strong> Delphi
Delphi
procedure rData(ID: Cardinal; queue: WideString; var Result: WideString); stdcall;
C ++
typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);
这篇关于C ++消费delphi DLL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!