我不能在 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;
这里有两个问题:
string
是一种原生 Delphi 类型,只能由 Embarcadero 工具创建和使用。此外,由于它使用 Delphi 运行时堆,因此必须使用ShareMem
或类似的。- 该函数使用默认的
register
调用约定,同样只能使用 Embarcadero 工具。
显而易见的前进方向是修复 DLL 并安排它使用标准平台互操作类型和调用约定。您可以将 BSTR
(Delphi 中的 WideString
)用于字符串,并将 stdcall
作为调用约定。
如果您不能更改 DLL,那么您唯一的希望就是使用与用于编译该错误 DLL 的相同的编译器来编写一个适配器 DLL。但这只有在错误的 DLL 是使用共享内存管理器编译的情况下才有效。如果不是这种情况,那么您的任务几乎是不可能完成的。
关于c++ - 将 var 字符串从 C++ 传递到 Delphi dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37069433/