【问题标题】:Passing var string from c++ to Delphi dll将 var 字符串从 c++ 传递到 Delphi dll
【发布时间】:2016-05-06 09:56:31
【问题描述】:

我不能在 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)

【问题讨论】:

  • 你能把字符串改成 pchar 吗?
  • 您只能从使用构建 DLL 的相同版本的 Delphi 编译的代码中调用该函数。也有sharemem。在继续之前,您需要修复您的 DLL。您需要了解的是,本机字符串类型是 Delphi 特定的类型。使用 WideString 是解决问题的好方法。
  • 我无法更改 dll(从以前的开发人员那里得到的,没有来源)

标签: c++ delphi dll


【解决方案1】:
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 是使用共享内存管理器编译时才有效。如果不是这样,那么您的任务几乎是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    相关资源
    最近更新 更多