如何在Delphi 2009中正确调用GetLongPathName并使用Unicode字符串?

3
我需要将旧的Win98短路径名更改为长路径名。我有一个在Delphi 4中运行良好的程序,但当我升级到Delphi 2009和Unicode时,它无法处理Unicode字符串。
我找了一圈,找不到适用于Unicode的版本。
似乎正确的例程是WinAPI中的GetLongPathName。但它似乎不在Delphi 2009的SysUtils库中,并且我没有能够弄清楚如何声明它以正确访问WinAPI例程。
此外,看起来可能很棘手,因为我读了SO问题:Delphi TPath.GetTempPath result is cropped,但那并没有帮助我进入第一垒。
请问有人可以解释如何在Delphi 2009中声明此函数并正确地传递Unicode字符串吗?
1个回答

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;

我相信最后一个函数声明会给出以下错误:[DCC Error] 函数需要结果类型。 - lkessler
3
如果函数参数和返回类型已经在接口部分声明过了,那么在实现部分就不需要重新声明。 - kludg
谢谢@Serg。它并不能在所有情况下都起作用,但是经过一点修正我让它工作了。我已经更新了你的答案以正确实现它。这真的帮了我很多。 - lkessler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接