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 CreateFolder(aFolderName: string; aLocation: Integer): Boolean;
var
pIdl: PItemIDList;
hPath: PChar;
begin
Result := False;
if SUCCEEDED(SHGetSpecialFolderLocation(0, aLocation, pidl)) thenbegin
hPath := StrAlloc(MAX_PATH);
SHGetPathFromIDList(pIdl, hPath);
SetLastError(0);
CreateDirectory(PChar(hPath + '\\' + aFolderName), nil);
if (GetLastError = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
Result := True;
FreePIDL(pIdl);
StrDispose(hPath);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateFolder('MyProgramgroup', CSIDL_PROGRAMS);
end;
Here's a translation of the content into Russian:
Это код на языке Delphi, который создает новый папку в директории "Программы" (CSIDL_PROGRAMS), когда кнопка нажата.
Расшифровка того, что код делает:
Процедура FreePidl используется для освобождения памяти, выделенной для структуры ItemIDList. Это необходимо потому, что SHGetMalloc выделяет память, которая должна быть освобождена.
Функция CreateFolder создает новую папку с указанным именем в указанной локации (в этом случае, CSIDL_PROGRAMS). Она возвращает булевое значение, указывающее, была ли создана папка успешно.
В обработчике события Button1Click, функция CreateFolder вызывается для создания новой папки с именем "MyProgramgroup" в директории "Программы".
Некоторые предложения по улучшению:
вместо использования SHGetMalloc и освобождения памяти вручную, можно использовать метод IMalloc.Free.
можно добавить обработку ошибок для случаев, когда создание папки не удается. Например, можно отобразить сообщение об ошибке, если CreateDirectory возвращает ненулевое значение.
также можно рассмотреть использование SHCreateDirectoryEx вместо CreateDirectory, так как она предоставляет больше функций и гибкости.
Здесь приведен модифицированный код:
procedureTForm1.Button1Click(Sender:TObject);beginifCreateFolder('MyProgramgroup',32)thenShowMessage('Папка создана успешно!')elseShowMessage('Не удалось создать папку!');end;functionCreateFolder(aFolderName:string;aLocation:Integer):Boolean;varpIdl:PItemIDList;hPath:PChar;beginResult:=False;ifSHGetSpecialFolderLocation(0,aLocation,pIdl)=S_OKthenbeginhPath:=StrAlloc(MAX_PATH);SHGetPathFromIDList(pIdl,hPath);SetLastError(0);ifCreateDirectory(PChar(hPath+'\')+aFolderName,nil)=S_OKthenResult:=True;IMalloc.Free(pIdl);StrDispose(hPath);end;end;
Замечание: я заменил CSIDL_PROGRAMS на константное значение 32, которое является правильным значением для директории "Программы". Возможно, вам нужно изменить это в зависимости от вашей версии Delphi и целевой платформы.
В статье описывается создание папки в меню кнопки ПУСК с помощью языка программирования Delphi, используя функции из библиотеки ShlObj и ActiveX.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS