C ++消费delphi DLL [英] C++ consuming delphi DLL

查看:190
本文介绍了C ++消费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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆