将PChar从Delphi DLL传递给C语言

时间:2013-04-19 10:32:35

标签: c++ delphi delphi-xe2

我目前无法动态导入Delphi DLL。 Delphi DLL函数声明为:

function TEST() : PChar; cdecl;
begin
  Result := '321 Test 123';
end;

在C ++中,我这样称呼它:

typedef char *TestFunc(void);
TestFunc* Function;
HINSTANCE hInstLibrary = LoadLibrary("Test.dll");
if (hInstLibrary)
{
    Function = (TestFunc*)GetProcAddress(hInstLibrary, "TEST");
    if (Function)
    {
        printf("%s", Function());
    }
}

问题是我只收到字符串的第一个字母。 如何告诉C ++字符串在第一个char之后没有结束?

由于

1 个答案:

答案 0 :(得分:2)

你有两个问题:

  1. Delphi发送给您的字符串是UTF-16编码的。如果要与PAnsiChar匹配,则需要编码为ANSI并返回char*
  2. 当函数返回时,返回指针引用的内存可能会被释放。您可以在函数中使用它,因为您返回一个字符串文字,该文字作为一个全局常量保存,可以持续使用DLL的生命周期。对于字符串变量,当调用者尝试读取已释放的内存时,您将遇到运行时错误。为了混淆问题,那些运行时错误将是间歇性的。您的代码可能似乎有效。部署到最重要的客户时会出现故障!
  3. 您解决第2项的选择:

    1. 安排调用者分配缓冲区,然后由被调用者填充。
    2. 在共享堆上分配和取消分配字符串。例如,具有CoTaskMemAllocCoTaskMemFree的COM堆。使用共享堆允许您在一个模块中分配,并在另一个模块中解除分配。
    3. 根据经验,如果能满足您的需求,请务必选择选项1。