C++ 将PChar从Delphi DLL传递到C

C++ 将PChar从Delphi DLL传递到C,c++,delphi,delphi-xe2,C++,Delphi,Delphi Xe2,我目前在动态导入Delphi DLL时遇到问题。 Delphi DLL函数声明如下: function TEST() : PChar; cdecl; begin Result := '321 Test 123'; end; 在C++中我这样称呼:< /P> typedef char *TestFunc(void); TestFunc* Function; HINSTANCE hInstLibrary = LoadLibrary("Test.dll"); if (hInstLibrary)

我目前在动态导入Delphi DLL时遇到问题。 Delphi DLL函数声明如下:

function TEST() : PChar; cdecl;
begin
  Result := '321 Test 123';
end;
在C++中我这样称呼:< /P>
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?

之后字符串没有结束? 谢谢你有两个问题:

  • Delphi发送给您的字符串是UTF-16编码的。如果要匹配
    char*
    ,则需要编码为ANSI并返回
    PAnsiChar
  • 当函数返回时,返回指针引用的内存可能会被释放。您可以在函数中使用它,因为您返回一个字符串文本,该字符串文本作为全局常量保存在DLL的生命周期中。对于字符串变量,当调用方尝试读取已释放的内存时,您将遇到运行时错误。让人困惑的是,这些运行时错误将是间歇性的。您的代码可能看起来有效。当您部署到您最重要的客户时,请期待失败 解决第2项的选项:

  • 安排调用者分配缓冲区,然后由被调用者填充缓冲区
  • 在共享堆上分配和取消分配字符串。例如,带有
    CoTaskMemAlloc
    CoTaskMemFree
    的COM堆。使用共享堆允许您在一个模块中分配,在另一个模块中取消分配

  • 根据经验,如果选项1能够满足您的需求,请始终选择它。

    哪种版本的delphi?您需要知道字符是1字节还是2字节。或者尝试使用PAnsiChar。我使用的是Delphi Xe2Wow。我要找的正是潘希卡!非常感谢@用户2227015,它只修复了您的一个问题。另一个问题更难解决。我真的不明白问题2是关于什么的。既然字符串传递正确,我可以将指针的值转移到另一个字符串,这样原始返回是否被释放就无关紧要了,可以吗?您对“指针的值”不感兴趣。你对它所指的记忆感兴趣。如果在函数返回时内存被释放,那么C代码就会有一个无效指针。从那个记忆中读取是未定义的行为。因此,如果您有一个名为
    mystr
    的Delphi字符串,并且在DLL函数中编写了
    Result:=PAnsiChar(mystr)
    ,那么您将遇到麻烦。函数返回时,
    Result
    引用的内存将被释放。选项3:在dll中分配(例如GetMem)并从dll中导出释放例程