2011-03-09 37 views
2

(Delphi 2006)爲了在應用程序啓動期間創建另一個文件夾,我正在獲取Common documents文件夾。這一直工作正常 - 它總是返回:GetSystemPath或SHGetSpecialFolderPath - 我該用於CommonDocs文件夾?

C:\Documents and Settings\All Users\Documents\ 

不過我已經收到了來自包括啓動日誌顯示應用西班牙用戶bug報告試圖創建:

MyApp\ 

而不是:

C:\Documents and Settings\All Users\Documents\MyApp\ 

即公共文檔文件夾字符串是空的。得到這個代碼是:

function GetCommonDocumentsFolder : TFilename ; 

begin 
Result := GetSystemPath (CSIDL_COMMON_DOCUMENTS) ; 
end ; 

我也注意到在我這個問題的研發,有也是一個系統調用:

SHGetSpecialFolderPath 

哪一個我應該使用? GetSystemPath(CSIDL_COMMON_DOCUMENTS)已爲我工作(至少在英語區域設置Windows XP)。

所以2個問題確實,可能與:

  • 爲什麼GetSystemPath(CSIDL_COMMON_DOCUMENTS)返回NULL?
  • 我應該實際上使用SHGetSpecialFolderPath嗎?

(男孩,這是一個很難找到的標籤)

來源爲神祕GetSystemPath:

function GetSystemPath (Folder: Integer) : TFilename ; 

{ Call this function with one of the constants declared above. } 

var 
    PIDL : PItemIDList ; 
    Path : LPSTR ; 
    AMalloc : IMalloc ; 

begin 
Path := StrAlloc (MAX_PATH) ; 
SHGetSpecialFolderLocation (Application.Handle, Folder, PIDL) ; 
if SHGetPathFromIDList (PIDL, Path) then 
    begin 
    Result := IncludeTrailingPathDelimiter (Path) ; 
    end 
else 
    begin 
    Result := '' ; 
    end ; ; 
SHGetMalloc(AMalloc) ; 
AMalloc.Free (PIDL) ; 
StrDispose (Path) ; 
end; 
+0

因此,最終,您是問使用API​​函數還是調用不同API函數的庫函數。這並不重要 - 他們都做同樣的事情。你應該做的是檢查API函數的返回值,以便知道你是否有有效的路徑。你的庫函數無用地返回一個空字符串,而不是告訴你它不能完成你所要求的。 – 2011-03-10 04:07:42

回答

1

你應該叫SHGetSpecialFolderPath當你想知道對應於路徑CSIDL

我不知道什麼GetSpecialFolderPath是,我無法在我的Delphi中找到它。你的意思是SHGetSpecialFolderPath?我也找不到GetSystemPath,但那不會改變我的答案!

+0

我的意思是SHGetSpecialFolderPath。謝謝。你無法找到GetSystemPath的原因是因爲(所以我剛發現)這是我必須從某個地方得到的例程 - 我已經將它添加到了問題中。它可能會回答這個問題 - 我想它由於某種原因失敗並返回一個空字符串。我猜SHGetSpecialFolderPath將在西班牙語Windows XP下不失敗地完成這項工作。我的錯。 (或者更準確地說,我的愚蠢) – rossmcm 2011-03-09 20:12:44

+0

@ross解釋它。只需使用SHGetSpecialFolderPath,一切都會好的! – 2011-03-09 20:13:54

相關問題