2010-08-19 78 views
3

我需要將舊的Win98短路徑名稱更改爲長路徑名稱。我有一個可以在Delphi 4下正常工作的例程,但是當我升級到Delphi 2009和Unicode時,它不適用於Unicode字符串。如何正確使用Delphi 2009和Unicode字符串調用GetLongPathName?

我環顧四周,無法找到與Unicode兼容的版本。

看起來使用的正確程序是GetLongPathName from the WinAPI。但它似乎並沒有在Delphi 2009的SysUtils庫中,我還無法弄清楚如何正確聲明它來訪問WinAPI例程。

此外,它看起來似乎很難打電話,因爲我讀過SO問題:Delphi TPath.GetTempPath result is cropped但這並沒有幫助我達到一壘。

有人能解釋一下如何聲明這個函數並在Delphi 2009中正確傳遞一個Unicode字符串嗎?

回答

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; 
+0

我相信最後的函數聲明給出:[DCC錯誤]函數需要結果類型 – lkessler 2010-08-20 00:39:22

+3

@lkessler:不,你不必重新聲明函數參數和結果類型在實現部分中,如果它們已經在接口部分中聲明。 – kludg 2010-08-20 01:00:41

+0

謝謝@Serg。它在所有情況下都不起作用,但在稍微修復後,我就開始工作了。我已更新您的答案,以便正確執行。這真的有幫助。 – lkessler 2010-08-20 03:58:10

相關問題