Как правильно вызвать GetLongPathName с использованием строк Delphi 2009 и Unicode? - PullRequest
3 голосов
/ 20 августа 2010

Мне нужно изменить старые короткие имена Win98 на длинные.У меня была подпрограмма, которая отлично работала с Delphi 4, но когда я обновился до Delphi 2009 и Unicode, он не работал со строками Unicode.

Я оглянулся и не смог найти Unicode-совместимую версиюit.

Похоже, что правильная подпрограмма для использования GetLongPathName из WinAPI .Но его, похоже, нет в библиотеке SysUtils Delphi 2009, и я не смог выяснить, как правильно его объявить для доступа к подпрограмме WinAPI.

Кроме того, кажется, что это может бытьсложно позвонить, потому что я прочитал SO Вопрос: Результат Delphi TPath.GetTempPath обрезается , но это не помогло мне добраться до первой базы.

Может кто-нибудь объяснить, какобъявить эту функцию и использовать ее правильно, передавая строку Unicode в Delphi 2009?

1 Ответ

4 голосов
/ 20 августа 2010

Конечно.Вам не нужен отдельный модуль, и вы можете объявить 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;
...