【发布时间】:2011-01-01 17:06:12
【问题描述】:
所以问题是是否可以将 Delphi 2009/2010 中的字符串文字(或 const 字符串)直接转换为 PAnsiChar,或者他们是否需要先对 AnsiString 进行额外的转换才能使其工作?
背景是我正在使用 C 接口调用旧版 DLL 中的函数,该 C 接口具有一些需要 C 样式字符指针的函数。在过去(在 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));
这似乎有效,我从函数调用中得到了正确的结果。然而,应用程序中存在一些明显的不稳定性,这似乎主要是通过调用遗留函数的代码第二次或第三次发生(在迁移到 IDE 的 2009 版本之前不存在)。在对此进行调查时,我意识到 Delphi 2009/2010 中的本机字符串文字(和 const 字符串)是一个 Unicode 字符串,因此我的转换可能有误。这里和其他地方的例子似乎表明这个调用应该更像这样:
LegacyFunction(PAnsiChar(AnsiString('Fred')))
让我感到困惑的是,对于第二个示例中的上述代码,将字符串文字直接转换为 PAnsiChar 不会产生任何编译器警告。如果不是字符串文字,而是转换字符串 var,我会收到一个可疑的转换警告(并且字符串会被破坏)。这(以及字符串在 DLL 中可用的事实)使我相信编译器正在做一些魔术来正确地将字符串文字解释为预期的字符串类型。这是正在发生的事情,还是双重转换(首先是 AnsiString,然后是 PAnsiChar)真的有必要,而我的代码中缺少它是难以追踪不稳定的原因吗?同样的答案是否也适用于 const 字符串?
【问题讨论】: