我在Delphi中调用Visual Studio编译的DLL中的C extern函数。 DLL方法又调用C ++方法,该方法将C ++字符串类型作为参数。 Delphi端的字符串是UTF-8编码的(没有BOM)。我需要确保采用字符串类型的C ++方法获取UTF-8编码的字符串。
我可以修改DLL源代码。我的问题:
Delphi端的我的UTF-8字符串是string类型。 C extern方法应该采用什么类型? PChar,PWideChar?以及如何将其转换为C ++字符串类型?
注意:我无法首先将UTF-8字符串转换为AnsiString,因为编码存储了一些必须保留的希腊字母。 C ++端将复制Delphi字符串并处理任何已分配的内存。
Delphi结束(使用XE6):
mystr : string;
callCExternMethod (mystr) // cast to what?
C ++ End(使用VS 2013):
void callCExternMethod (????? mystr) {
// convert mystr to C++ string type
callCPlusPlusMethod (takes C++ string type)
}
答案 0 :(得分:6)
在Delphi端,参数为PAnsiChar
,您可以像这样传递:PAnsiChar(Utf8String(str))
。
在C ++端,您收到参数const char*
。
显然,您需要确保调用约定匹配。
答案 1 :(得分:1)
另一种选择是使用UTF8String
类型:
mystr : string;
u8: UTF8String;
u8 := UTF8String(mystr);
callCExternMethod(PAnsiChar(u8));
注意:UTF8String
类型不适用于Delphi XE5到10.0 Seattle中的移动平台,除非您使用补丁启用它:
http://andy.jgknet.de/blog/2013/10/the-return-of-the-byte-strings/
UTF8String
已重新启用,可在德尔福10.1柏林的移动设备中使用。