我有以下 C++ 函数,它导出一个结构,其中包含一个 char*
字段,但在 Delphi 中使用时,字符串值并不像预期的那样,尽管它是空终止的。
typedef struct _MyStruct{
char* name;
// other fields
}MyStruct,*PMyStruct;
extern "C" __declspec(dllexport) __cdecl MyTestStr(PMyStruct _PMyStruct)
{
std::string str = "string";
std::vector<char> cstr(str.begin(), str.end);
cstr.push_back('\0');//null-terminated
_PMyStruct->name = cstr.data();
}
type
PMyStruct = ^MyStruct;
MyStruct= record
name : PAnsiChar;
// other fields
end;
procedure MyTestStr(_PMyStruct: PMyStruct); cdecl; external 'mytest.dll' name 'MyTestStr';
procedure TestMyRec();
var
_MyStruct: MyStruct;
begin
MyTestStr(@_MyStruct);
showmessage(_MyStruct.name);
// here the result is just 'YYYYYYYYYYYYYYYYYY' not 'string'
end;
最佳答案
_PMyStruct->name=cstr.data();
只是指向字符串主体。但是在函数调用之后 local object std::string
应该被处理掉。所以你有指向一些内容不可预测的内存地址的指针,如果内存不属于应用程序,这可能会导致 AV。
似乎您必须分配内存并调用复制所需数据到该内存地址的函数。需要时释放此内存。
关于c++ - Delphi 和 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52776637/