C++ 将PChar从Delphi DLL传递到C
我目前在动态导入Delphi DLL时遇到问题。 Delphi DLL函数声明如下: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)
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?之后字符串没有结束?
谢谢你有两个问题:
char*
,则需要编码为ANSI并返回PAnsiChar
CoTaskMemAlloc
和CoTaskMemFree
的COM堆。使用共享堆允许您在一个模块中分配,在另一个模块中取消分配根据经验,如果选项1能够满足您的需求,请始终选择它。哪种版本的delphi?您需要知道字符是1字节还是2字节。或者尝试使用PAnsiChar。我使用的是Delphi Xe2Wow。我要找的正是潘希卡!非常感谢@用户2227015,它只修复了您的一个问题。另一个问题更难解决。我真的不明白问题2是关于什么的。既然字符串传递正确,我可以将指针的值转移到另一个字符串,这样原始返回是否被释放就无关紧要了,可以吗?您对“指针的值”不感兴趣。你对它所指的记忆感兴趣。如果在函数返回时内存被释放,那么C代码就会有一个无效指针。从那个记忆中读取是未定义的行为。因此,如果您有一个名为
mystr
的Delphi字符串,并且在DLL函数中编写了Result:=PAnsiChar(mystr)
,那么您将遇到麻烦。函数返回时,Result
引用的内存将被释放。选项3:在dll中分配(例如GetMem)并从dll中导出释放例程