首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Delphi2009中将字符串转换为PAnsiChar

在Delphi2009中将字符串转换为PAnsiChar
EN

Stack Overflow用户
提问于 2008-11-12 12:14:10
回答 5查看 86K关注 0票数 27

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

这里有一个例子来演示我遇到的问题:

var
  s: PAnsiChar;

...

s := PAnsiChar(Application.ExeName);

在Delphi2007及以前的版本中,s := PChar(Application.ExeName)将返回应用程序的exe路径。

在Delphi2009中,s := PAnsiChar(Application.ExeName)仅返回'E‘。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-11-12 12:19:27

我这里没有Delphi2009,所以我无法检查它。但也许你必须尝试一下:

s := PAnsiChar(AnsiString(Application.ExeName));

正如gabr已经指出的那样,这不是一个非常好的实践,只有在100%确定的情况下才会使用它。该字符串仅包含直接映射到ANSI范围的字符。

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

票数 40
EN

Stack Overflow用户

发布于 2010-02-26 04:20:17

使用RawByteString,而不是使用类型String

s: RawByteString;

s := LoadSomeRegularString(usually a string type);

PAnsiChar(s) <<< all fine.
票数 5
EN

Stack Overflow用户

发布于 2008-11-12 13:10:00

Gamecat显式转换工作。我将在下面更详细地解释这个问题,以便有人可以指出更好的解决方案。

我使用以下函数来检索应用程序的编译日期:

function LinkerTimeStamp(const FileName: string): TDateTime;
var
  LI: TLoadedImage;
begin
  {$IFDEF UNICODE}
  Win32Check(MapAndLoad(PAnsiChar(AnsiString(FileName)), nil, @LI, False, True));
  {$ELSE}
  Win32Check(MapAndLoad(PChar(FileName), nil, @LI, False, True));
  {$ENDIF}
  Result := LI.FileHeader.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta;
  UnMapAndLoad(@LI);
end;

MapAndLoad需要一个PAnsiChar作为ImageName参数,所以我需要转换unicode字符串。有没有其他方法可以先显式地转换成AnsiString?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/283759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档