在Delphi 2009中将字符串转换为PAnsiChar

sma*_*ins 21 delphi delphi-2009

我正在将我的应用程序转换为Delphi 2009,并且遇到了一些需要将字符串(宽)转换为AnsiString的调用的有趣问题.

这是一个展示我遇到的问题的例子:

var
  s: PAnsiChar;

...

s := PAnsiChar(Application.ExeName);
Run Code Online (Sandbox Code Playgroud)

使用Delphi 2007和以前的版本,s:= PChar(Application.ExeName)将返回应用程序exe路径.

使用Delphi 2009,s:= PAnsiChar(Application.ExeName)仅返回'E'.

我的猜测是因为我正在将unicode字符串转换为ansi字符串,但是如何将其转换为PAnsiChar获取完整字符串?

Too*_*the 32

我这里没有Delphi 2009,所以我无法检查它.但也许你必须尝试:

s := PAnsiChar(AnsiString(Application.ExeName));
Run Code Online (Sandbox Code Playgroud)

正如gabr已经指出的那样,这不是一个很好的做法,只有你100%肯定才能使用它.该字符串仅包含直接映射到ANSI范围的字符.

这就是为什么你应该得到一个警告,因为你正在将Unicode转换为ANSI.


小智 5

而不是使用 type String,使用RawByteString

s: RawByteString;

s := LoadSomeRegularString(usually a string type);

PAnsiChar(s) <<< all fine.
Run Code Online (Sandbox Code Playgroud)