将 char * 传递给 delphi dll 函数/过程

apt*_*ypr 0 c++ delphi

我有带有字符串参数的 delphi 函数:

function a(param: string): integer;
begin
{do something}
end
Run Code Online (Sandbox Code Playgroud)

我如何从 C++ 调用该函数?我将 string 切换为 pchar 或 pansichar 但这不起作用。C++ typedef 是

typedef int (*StringFunction) (char *a);
Run Code Online (Sandbox Code Playgroud)

我运行它就像

char *b = "abc";
StringFunction sf;
//loading sf
cout << sf(b);
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

您无法从 C++ 调用该函数。Delphistring类型是私有 Delphi 类型。对于互操作,您需要使用指向以空字符结尾的字符数组的指针。在 C++ 中是char*,在 Delphi 中是PAnsiChar

此外,您的 Delphi 函数使用的register调用约定是基于寄存器的fastcall约定。同样,您无法从其他语言访问它。您需要使用标准调用约定之一。

C++ 代码中的函数指针已传递char*, 并使用cdecl调用约定。所以你只需要让Delphi函数匹配即可:

function a(param: PAnsiChar): integer; cdecl;
Run Code Online (Sandbox Code Playgroud)

上述声明与您问题中的 C++ 代码兼容。


如果您更喜欢使用,stdcall那么您需要更改 Delphi 和 C++ 代码。

德尔福

function a(param: PAnsiChar): integer; stdcall;
Run Code Online (Sandbox Code Playgroud)

C++

typedef int (__stdcall *StringFunction) (char *a);
Run Code Online (Sandbox Code Playgroud)