{
Constants:
CSIDL_DESKTOP
CSIDL_INTERNET
CSIDL_PROGRAMS
CSIDL_CONTROLS
CSIDL_PRINTERS
CSIDL_PERSONAL
CSIDL_FAVORITES
CSIDL_STARTUP
CSIDL_RECENT
CSIDL_SENDTO
CSIDL_BITBUCKET
CSIDL_STARTMENU
CSIDL_DESKTOPDIRECTORY
CSIDL_DRIVES
CSIDL_NETWORK
CSIDL_NETHOOD
CSIDL_FONTS
CSIDL_TEMPLATES
CSIDL_COMMON_STARTMENU
CSIDL_COMMON_PROGRAMS
CSIDL_COMMON_STARTUP
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_APPDATA
CSIDL_PRINTHOOD
CSIDL_ALTSTARTUP
CSIDL_COMMON_ALTSTARTUP
CSIDL_COMMON_FAVORITES
CSIDL_INTERNET_CACHE
CSIDL_COOKIES
CSIDL_HISTORY
}uses
ActiveX, ShlObj;
procedure TForm1.Button1Click(Sender: TObject);
// Replace CSIDL_HISTORY with the constants above var
Allocator: IMalloc;
SpecialDir: PItemIdList;
FBuf: array[0..MAX_PATH] of Char;
PerDir: string;
beginif SHGetMalloc(Allocator) = NOERROR thenbegin
SHGetSpecialFolderLocation(Form1.Handle, CSIDL_HISTORY, SpecialDir);
SHGetPathFromIDList(SpecialDir, @FBuf[0]);
Allocator.Free(SpecialDir);
ShowMessage(string(FBuf));
end;
end;
// With Windows Me/2000, the SHGetSpecialFolderLocation function // is superseded by ShGetFolderLocation. // function to get the desktop folder location: function GetDeskTopPath : string;
var
shellMalloc: IMalloc;
ppidl: PItemIdList;
PerDir: string;
begin
ppidl := nil;
tryif SHGetMalloc(shellMalloc) = NOERROR thenbegin
SHGetSpecialFolderLocation(Form1.Handle, CSIDL_DESKTOP, ppidl);
SetLength(Result, MAX_PATH);
ifnot SHGetPathFromIDList(ppidl, PChar(Result)) thenraise exception.create('SHGetPathFromIDList failed : invalid pidl');
SetLength(Result, lStrLen(PChar(Result)));
end;
finallyif ppidl <> nilthen
shellMalloc.free(ppidl);
end;
end;
Перевод:
Код, предоставленный в Delphi, используется для получения путей специальных папок на системе Windows.
Процедура Button1Click использует функцию SHGetSpecialFolderLocation для получения пути специальной папки (в этом случае, CSIDL_ HISTORY) и затем отображает путь с помощью ShowMessage.
Функция GetDeskTopPath используется для получения местоположения папки桌а.
Вот как можно улучшить этот код:
Обработка ошибок: текущая обработка ошибок в функции GetDeskTopPath недостаточна. Лучше было бы проверять, возвращает ли SHGetMalloc ошибку перед вызовом SHGetSpecialFolderLocation.
Организация кода: код сейчас организован как одиночная процедура и функция. Было бы более читаемым и поддерживаемым, если логика для получения пути каждой специальной папки была в своей собственной процедуре или функции.
Проверка типа: в Delphi рекомендуется использовать проверку типа для обеспечения того, что переменные имеют правильный тип перед использованием.
В этом улучшенном варианте функция GetDeskTopPath переименована в GetSpecialFolderPath, и она принимает параметр идентификатора папки. Обработка ошибок была улучшена, а код стал более организованным и читаемым.
В статье описывается получение путей специальных папок в системе Windows с помощью функции SHGetSpecialFolderLocation и ShGetFolderLocation.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.