首页 > 解决方案 > Delphi 和 c++ 结构

问题描述

我有以下 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;

标签: c++delphi

解决方案


_PMyStruct->name=cstr.data();只是将指针指向字符串主体。但是在函数调用之后本地对象 std::string应该被处理掉。所以你有一个指向一些内容不可预测的内存地址的指针,如果内存不属于应用程序,这可能会导致 AV。

似乎您必须分配内存并调用将所需数据复制到此内存地址的函数。需要时释放此内存。


推荐阅读