C++ 消费 delphi DLL

标签 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 兼容。

有人帮帮我

EDIT:

This is the function I want to call the DLL:

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

After changing the code looked like this:

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);
}

最佳答案

您几乎没有机会调用该函数。

首先,您当前的代码不能指望成功,因为我假设 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 以匹配。

你正在看这样的东西:

德尔福

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

C++

typedef void (__stdcall *ReturnDataSPL)(DWORD, BSTR, BSTR&);

关于C++ 消费 delphi DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767113/

相关文章:

c++ - 'printf' : identifier not found

Delphi Firedac Update 不应用修改

function - Delphi XE7 Android 如何存储函数指针以便以后访问?

c# - 将 native dll 和其他文件添加到 .net exe

c# - 从内存中加载库/模块

c++ - 创建迭代字符串

c++ - 对具有许多模板参数的类进行操作

c++ - 我可以从 std::string 继承以提供强类型字符串吗?

delphi - TImageList.ShareImages-如何准确使用而不必复制内容?

dll - OpenCV版本的有意混合