c++ - 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;
解决方案
_PMyStruct->name=cstr.data();
只是将指针指向字符串主体。但是在函数调用之后本地对象 std::string
应该被处理掉。所以你有一个指向一些内容不可预测的内存地址的指针,如果内存不属于应用程序,这可能会导致 AV。
似乎您必须分配内存并调用将所需数据复制到此内存地址的函数。需要时释放此内存。
推荐阅读
- google-cloud-platform - gcloud:我们能否以表格格式获取 GCP 配额详细信息
- python - 为其他包创建包扩展 [Python]
- swift - 如何通过单击查看来调用函数
- r - 如何使用“x统一”模式更改R plotly悬停标签的顺序
- macos - Sublime 将文件名截断为 50 个字符
- c - 为什么我使用递归的阶乘程序不起作用
- sql - SQL - 在 SQL 中跟踪超过 2 分钟速度为 0 的时间量
- c++ - 我不能在 else if 语句中调用函数
- python - 如何将异常堆栈跟踪重定向到文件?
- node.js - nodemailer 解析 localhost 而不是 smtp 传输定义