如何使用Delphi 2009和Unicode字符串正确调用GetLongPathName?

时间:2010-08-19 23:58:33

标签: delphi winapi unicode delphi-2009

我需要将旧的Win98短路径名称更改为长路径名称。我有一个适用于Delphi 4的例程,但是当我升级到Delphi 2009和Unicode时,它无法使用Unicode字符串。

我环顾四周,找不到与Unicode兼容的版本。

似乎正确使用的例程是GetLongPathName from the WinAPI。但它似乎不在Delphi 2009的SysUtils库中,我无法弄清楚如何正确地声明它来访问WinAPI例程。

此外,似乎打电话可能很棘手,因为我已经阅读了SO问题:Delphi TPath.GetTempPath result is cropped但这并没有帮助我达到一垒。

有人可以解释一下如何声明这个函数并在Delphi 2009中正确使用它传递一个Unicode字符串吗?

1 个答案:

答案 0 :(得分:4)

不确定。您不需要单独的单元,可以在任何地方声明GetLongPathName:

function GetLongPathName(ShortPathName: PChar; LongPathName: PChar;
    cchBuffer: Integer): Integer; stdcall; external kernel32 name 'GetLongPathNameW';

function ExtractLongPathName(const ShortName: string): string;
begin
  SetLength(Result, GetLongPathName(PChar(ShortName), nil, 0));
  SetLength(Result, GetLongPathName(PChar(ShortName), PChar(Result), length(Result)));
end;

procedure Test;
var
  ShortPath, LongPath: string;
begin
  ShortPath:= ExtractShortPathName('C:\Program Files');
  ShowMessage(ShortPath);
  LongPath:= ExtractLongPathName(ShortPath);
  ShowMessage(LongPath);
end;