ShlObj 單元
function GetPath(FID: Integer): string;
var
PIDL: PItemIDList;
Path: array[0..MAX_PATH] of Char;
begin
SHGetSpecialFolderLocation(0, FID, PIDL);
SHGetPathFromIDList(PIDL, Path);
Result := Path;
end;
範例程式定義 58 個常數,涵蓋桌面、我的文件、程式檔、系統目錄、網路芳鄰等:
| 常數 | 十六進位 | 說明 |
|---|---|---|
| CSIDL_DESKTOP | $0000 | 桌面 |
| CSIDL_PERSONAL | $0005 | 我的文件 |
| CSIDL_PROGRAM_FILES | $0026 | Program Files |
| CSIDL_WINDOWS | $0024 | Windows 目錄 |
| CSIDL_SYSTEM | $0025 | System32 |
| CSIDL_APPDATA | $001A | 應用程式資料 (Roaming) |
| CSIDL_LOCAL_APPDATA | $001C | 本機應用程式資料 (Local) |
| CSIDL_COMMON_APPDATA | $0023 | 所有使用者應用程式資料 |
| CSIDL_STARTUP | $0007 | 啟動資料夾 |
| CSIDL_FONTS | $0014 | 字型資料夾 |
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
S: string;
begin
Memo1.Clear;
for I := 0 to Length(Arr) - 1 do begin
S := GetPath(Arr[I]);
if S <> '' then
Memo1.Lines.Add(Format('%d:'#9'%s', [Arr[I], S]));
end;
end;

Windows Vista+ 建議使用 SHGetKnownFolderPath (搭配 KNOWNFOLDERID GUID),支援更多資料夾且不受 MAX_PATH 限制。Delphi 可透過 Winapi.ShlObj 使用。
掌握 SHGetSpecialFolderLocation + SHGetPathFromIDList 組合,能可靠取得跨版本、跨使用者、跨語系的系統特殊路徑,是 Delphi 開發安裝程式、設定檔管理、資料儲存的基礎技能。