GetSystemPath или SHGetSpecialFolderPath - Что мне использовать для папки CommonDocs?

(Delphi 2006) Я получаю папку "Общие документы" для создания из нее другой папки во время запуска моего приложения. Это работало нормально - всегда возвращает:

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

но я только что получил сообщение об ошибке от испанского пользователя, которое включает журнал запуска, который показывает, что приложение пыталось создать:

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) возвращает ноль?
  • на самом деле я должен использовать 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;

1 ответ

Решение

Вам следует позвонить SHGetSpecialFolderPath когда вы хотите узнать путь, соответствующий CSIDL.

Я не знаю что GetSpecialFolderPath Я не могу найти его в моем Delphi. Ты имел ввиду SHGetSpecialFolderPath? Я тоже не могу найти GetSystemPath, но это не меняет мой ответ!

Другие вопросы по тегам