在 Delphi 中使用 C++ 类一直是个问题。
受刘麻子大哥的启发,有了这个问题。
在此郑重感谢刘麻子哥。
Delphi 中 string 是一段内存块。
C++ 中 string 是一个标准 C++ 类。
既然是类,那就有大小。C++ string 类大小:24字节(VS2019 中测试获取到)。
那么我们可以在 Delphi 中定义一个24字节的内存区,然后将数据填充到这个24字节的内存区中,传递给 C++,应该就可以了。
C++ 中的 string 类的内存结构:
type
{ C++ String 类内存结构 大小:24字节 }
VCString = record
strMem: PDWORD; // 字符串指针
R1, R2, R3: DWORD; // 未知
len: DWORD; // 字符串长度
R4: DWORD; // 定值 = $0000002F
end;
Delphi string ---> C++ string 的转换函数:
{ Delphi String 转换为 C++ String }
function DelphiString2VCString(strFileName: string): VCString;
var
vcs: AnsiString;
begin
FillChar(Result, SizeOf(VCString), #0); // 置空
vcs := AnsiString(strFileName); // 宽字节转换为短字节
Result.strMem := @vcs[1]; // 字符串指针
Result.len := Length(vcs); // 字符串长度
Result.R4 := $0000002F; // 定值
end;
测试环境:Windows10 + VS2019 + Delphi XE2:
Debug 下,测试通过。
Release 下,退出时会报异常。打开编译选项:,就可以通过了。
测试源码在这里:https://github.com/dbyoung720/DString2VCString
其它 C++ 类,可以用类似方法。
记录保存一下。
有不对的地方,还请高手指点。