uses
ShlObj, ActiveX;
procedure FreePidl(pidl: PItemIDList);
var
allocator: IMalloc;
beginif Succeeded(SHGetMalloc(allocator)) thenbegin
allocator.Free(pidl);
{$IFDEF VER100}
allocator.Release;
{$ENDIF}end;
end;
function GetStartMenu: string;
var
pidl: PItemIDList;
buf: array[0..MAX_PATH] of Char;
beginif Succeeded(SHGetSpecialFolderLocation(Form1.Handle, CSIDL_STARTMENU, pidl)) then
SHGetPathFromIDList(pidl, buf);
Result := StrPas(buf);
// The calling application is responsible for freeing the PItemIDList-pointer // with the Shell's IMalloc interface
FreePIDL(pidl);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption := GetStartMenu;
end;
Here's a translation of the content into Russian:
Это программный код на Delphi, который получает путь к папке Старт-Меню и отображает его в контроле Label, когда кнопка нажата.
Вот разбивка кода:
Процедура FreePidl используется для освобождения памяти, выделенной для указателя на ItemIDList (PIDL). Это необходимо потому, что интерфейс IMalloc оболочки отвечает за управление памятью PIDL-указателей.
Функция GetStartMenu получает путь к папке Старт-Меню с помощью функции SHGetSpecialFolderLocation, которая принимает handle окна (Form1.Handle) и ID специальной папки (CSIDL_STARTMENU) в качестве аргументов. Если функция успешна, она возвращает указатель на PIDL.
Функция GetPathFromIDList используется для преобразования PIDL в строку пути. Эта функция принимает PIDL-указатель и буфер (массив символов) в качестве аргументов и заполняет буфер строкой пути.
Переменная Result устанавливается в строку пути с помощью функции StrPas, которая конвертирует PAnsiChar или PUnicodeChar в строку.
Наконец, процедура FreePIDL вызывается для освобождения памяти, выделенной для PIDL-указателя.
Событийный обработчик кнопки Button1Click просто вызывает функцию GetStartMenu и устанавливает текст контрола Label (label1) в результат.
Вот предложения:
Вместо использования функции SHGetMalloc для получения интерфейса IMalloc, вы могли бы использовать метод IMalloc.Create, чтобы создать экземпляр аллокатора.
Вы также можете рассмотреть более современный подход к получению пути папки Старт-Меню, например, используя функцию SHGetKnownFolderPath с константой FOLDERID_StartMenu.
Вот обновленная версия кода, которая включает в себя эти предложения:
Замечание: я заменил функцию SHGetSpecialFolderLocation на SHGetKnownFolderPath, и использовал метод IMalloc.Create, чтобы создать экземпляр аллокатора. Я также удалил неиспользуемый вызов allocator.Release, поскольку мы используем метод Free, чтобы освободить PIDL-указатель.
Код на языке Delphi, который получает путь к папке кнопки Пуск и отображает его в лейбле при нажатии на кнопку.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.