Как получить FileName и каталог панелей управления Windows?
В Delphi создайте приложение VCL Forms. Используйте 64-разрядную платформу Windows, если вы используете 64-разрядную версию Windows.
Используйте следующий код:
unit Unit1;
interface
uses
CodeSiteLogging,
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure GetControlPanelItems;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Winapi.ShlObj, Winapi.ShellAPI, System.Win.ComObj;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
GetControlPanelItems;
end;
procedure TForm1.GetControlPanelItems;
var
psfDeskTop: IShellFolder;
psfControl: IShellFolder;
pidControl: PITEMIDLIST;
pidChild: PITEMIDLIST;
pidAbsolute: PItemIdList;
pEnumList: IEnumIDList;
celtFetched: ULONG;
FileInfo: SHFILEINFOW;
ShExeInfo: SHELLEXECUTEINFO;
begin
OleCheck(SHGetDesktopFolder(psfDeskTop));
OleCheck(SHGetSpecialFolderLocation(0, CSIDL_CONTROLS, pidControl));
OleCheck(psfDeskTop.BindToObject(pidControl, nil, IID_IShellFolder, psfControl));
OleCheck(psfControl.EnumObjects(0, SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN or SHCONTF_FOLDERS, pEnumList));
while pEnumList.Next(1, pidChild, celtFetched) = 0 do
begin
pidAbsolute := ILCombine(pidControl, pidChild);
SHGetFileInfo(LPCTSTR(pidAbsolute), 0, FileInfo, SizeOf(FileInfo), SHGFI_PIDL or SHGFI_DISPLAYNAME or SHGFI_TYPENAME);
CodeSite.Send('TForm1.GetControlPanelItems: szDisplayName', FileInfo.szDisplayName);
// Exe-Info:
ZeroMemory(@ShExeInfo, SizeOf(ShExeInfo));
ShExeInfo.cbSize := SizeOf(ShExeInfo);
ShExeInfo.lpVerb := 'Open';
// control panel item's PIDL:
ShExeInfo.lpIDList := pidAbsolute;
ShExeInfo.nShow := SW_SHOWNORMAL;
ShExeInfo.fMask := SEE_MASK_IDLIST;
//ShExeInfo.lpFile := ???
//ShExeInfo.lpDirectory := ???
CodeSite.Send('TForm1.GetControlPanelItems: ShExeInfo.lpFile', ShExeInfo.lpFile);
CodeSite.Send('TForm1.GetControlPanelItems: ShExeInfo.lpDirectory', ShExeInfo.lpDirectory);
end;
end;
end.
Это заставляет меня отображать названия панелей управления.
Но как я могу получить пути к файлам? (ShExeInfo.lpDirectory, ShExeInfo.lpFile)
1 ответ
Как уже упоминалось здесь, может быть бесполезно пытаться получить имя файла определенного двоичного файла апплета, поскольку в одном двоичном файле может быть реализовано несколько апплетов. Для общей задачи, добавленной в ваш комментарий, создайте ссылки ярлыков оболочки, просто используйте абсолютный ITEMIDLIST, который вы знаете в цикле, и установите его для созданного объекта IShellLink с помощью метода SetIDList.