uses Windows, SysUtils; type TGetLongPathNameFunc = function(lpszShortPath: PChar; lpszLongPath: PChar; cchBuffer: DWORD): DWORD; stdcall; function ToLongFilename(const Filename: String): String; var Size: Integer; GetLongPathName: TGetLongPathNameFunc; begin Result := Filename; if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then // Windows 2000 or later begin @GetLongPathName := GetProcAddress(GetModuleHandle('Kernel32.dll'), {$IFDEF Unicode} 'GetLongPathNameW'); {$ELSE} 'GetLongPathNameA'); {$ENDIF} if Assigned(GetLongPathName) = True then begin { Calculate buffer size } Size := GetLongPathName(PChar(Filename),nil,0); if Size = 0 then begin Exit; end; { Convert to long name } SetLength(Result,Size); Size := GetLongPathName(PChar(Filename),PChar(Result),Size); SetLength(Result,Size); end; end; end;
この例でもGetShortPathNameを使用する場合と同様に、対象となるファイルが存在しないと最初のGetLongPathName呼び出しで0が返ってきて変換不能になってしまうため、注意が必要です。
2018/11/08追記: TGetLongPathNameFuncの宣言で引数名が入れ替わっていたものを修正。ご指摘ありがとうございます。
2 件のコメント:
宣言の変数名の意味合いが間違ってるよ。
どっちもポインタだから動作上は問題ないけど。
DWORD GetLongPathName(
LPCTSTR lpszShortPath,
LPTSTR lpszLongPath,
DWORD cchBuffer
);
あーほんとですね。ご指摘ありがどうございます。
コメントを投稿