c++ - 将 var 字符串从 C++ 传递到 Delphi dll

标签 c++ delphi dll

我不能在 delphi 中使用 dll 的功能。我在类型转换方面遇到了一些问题。

这是我要调用 Delphi DLL 的函数:

function SyncFunc(var Type:string; var MaxUsers:integer; var ErrCode :Word):boolean;

C++代码:

unsigned char(WINAPI    *SyncFunc)(PCHAR Type, INT *MaxUsers, WORD *ErrCode);

HMODULE hLib;
BOOL Res = FALSE;
WORD ErrCode = 0;
INT MaxUsers = 0;
CHAR Type[256];
hLib = LoadLibrary("delphi.dll");
Res = SyncFunc(Type, &MaxUsers, &ErrCode);

有人请帮忙。 附言类似问题在这里C++ consuming delphi DLL (但我的函数使用字符串,而不是 WideString)

最佳答案

function SyncFunc(var Type:string; var MaxUsers:integer; var ErrCode :Word):boolean;

这里有两个问题:

  1. string 是一种原生 Delphi 类型,只能由 Embarcadero 工具创建和使用。此外,由于它使用 Delphi 运行时堆,因此必须使用 ShareMem 或类似的。
  2. 该函数使用默认的 register 调用约定,同样只能使用 Embarcadero 工具。

显而易见的前进方向是修复 DLL 并安排它使用标准平台互操作类型和调用约定。您可以将 BSTR(Delphi 中的 WideString)用于字符串,并将 stdcall 作为调用约定。

如果您不能更改 DLL,那么您唯一的希望就是使用与用于编译该错误 DLL 的相同的编译器来编写一个适配器 DLL。但这只有在错误的 DLL 是使用共享内存管理器编译的情况下才有效。如果不是这种情况,那么您的任务几乎是不可能完成的。

关于c++ - 将 var 字符串从 C++ 传递到 Delphi dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37069433/

相关文章:

c++ - 重写派生类中基类私有(private)成员的行为,C++

delphi - 如何将内存流从我的应用程序传递到 DLL 或从 DLL 检索内存流?

c# - 如何从捕获的异常中打印消息?

c++ - SFINAE enable_if 显式构造函数

c++ - 在固定模板参数的同时扩展模板类

c++ - Qt 5 中的屏幕键盘

delphi - 如何使用变量运行 shellexecute?

Delphi - 将 BCC 和 CC 收件人添加到 OLE Outlook 对象

c++ - 如何通过 Code::Blocks 中的静态链接创建独立程序

c# - 来自外部 DLL 的未处理的 DivideByZero 异常 - C#