当前位置 : 主页 > 编程语言 > delphi >

将Delphi 2009/2010字符串文字转换为PAnsiChar

来源:互联网 收集:自由互联 发布时间:2021-06-23
所以问题是Delphi 2009/2010中的字符串文字(或const字符串)是否可以直接转换为PAnsiChar,或者他们是否需要首先对AnsiString进行额外的转换才能使其工作? 背景是我在具有C接口的旧DLL中调用函
所以问题是Delphi 2009/2010中的字符串文字(或const字符串)是否可以直接转换为PAnsiChar,或者他们是否需要首先对AnsiString进行额外的转换才能使其工作?

背景是我在具有C接口的旧DLL中调用函数,该接口具有一些需要C样式的char指针的函数.在过去(在Delphi 2009之前),像下面这样的代码就像一个魅力(其中C DLL函数的参数是LPCSTR):

之一:

LegacyFunction(PChar('Fred'));

要么

const
  FRED = 'Fred';
...
LegacyFunction(PChar(FRED));

因此,在更改为Delphi 2009(现在是2010年)时,我将调用更改为:

LegacyFunction(PAnsiChar('Fred'));

要么

const
  FRED = 'Fred';
...
LegacyFunction(PAnsiChar(FRED));

这似乎工作,我从函数调用得到正确的结果.然而,应用程序中存在一些明确的不稳定性,这些不稳定似乎主要发生在调用遗留函数的代码中的第二次或第三次(在转移到2009版本的IDE之前不存在).在研究这个时,我意识到Delphi 2009/2010中的本地字符串文字(和const字符串)是一个Unicode字符串,所以我的演员可能是错误的.这里和其他地方的示例似乎表明此调用看起来应该更像这样:

LegacyFunction(PAnsiChar(AnsiString('Fred')))

令我困惑的是,使用上面第二个示例中的代码,将字符串文字直接转换为PAnsiChar不会生成任何编译器警告.如果不是字符串文字,我正在构建一个字符串var,我会得到一个可疑的强制警告(并且该字符串会被修复).这(以及字符串在DLL中可用的事实)使我相信编译器正在做一些魔术来正确地将字符串文字解释为预期的字符串类型.这是发生了什么,或者是双重演员(首先是AnsiString,然后是PAnsiChar)真的有必要,而且在我的代码中缺少它是难以追踪不稳定的原因吗?对于const字符串,同样的答案是否也适用?

默认情况下,常量(包括字符串文字)是无类型的,编译器会将它们调整为您在其中使用的上下文中的任何格式.只要字符串文字中没有非ANSI字符,编译器就会赢得’在这种情况下,生成字符串为ANSI而不是Unicode有任何问题.
网友评论