如何将Delphi中的UTF-8字符串传递给DLL C extern函数?

时间:2016-05-04 17:37:11

标签: c string delphi utf-8

我在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)
}

2 个答案:

答案 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柏林的移动设备中使用。