uses
ShlObj, ShellAPI,
ActiveX, CommCtrl, ShellHelper;
procedure TForm1.FormCreate(Sender: TObject);
var
TempImgList : HIMAGELIST;
fi : TSHFileInfo;
begin
// Ich sag´s noch mal: Die beiden Imagelisten "small" und
// "big" müssen der List-View zugeordnet sein, UND IHRE
// EIGENSCHAFT "ShareImages" MUSS AUF true STEHEN!!!
// kleine Symbole aus dem System
TempImgList := HIMAGELIST(SHGetFileInfo('
',0,fi,sizeof(fi),
SHGFI_SYSICONINDEX
or SHGFI_SMALLICON));
if(TempImgList <> 0)
then small.Handle := TempImgList;
// große Symbole aus dem System
TempImgList := HIMAGELIST(SHGetFileInfo('
',0,fi,sizeof(fi),
SHGFI_SYSICONINDEX
or SHGFI_ICON));
if(TempImgList <> 0)
then big.Handle := TempImgList;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
pMalloc : IMalloc;
iDesktop,
iMyComputer : IShellFolder;
pidlRoot,
pidlItem,
tmp : PItemIdList;
ppEnum : IEnumIdList;
celtFetched : ULONG;
begin
lv.Items.Clear;
lv.Items.BeginUpdate;
if(CoInitializeEx(
nil,COINIT_APARTMENTTHREADED) = S_OK)
then
try
if(SHGetMalloc(pMalloc) = NOERROR)
and
(SHGetDesktopFolder(iDesktop) = NOERROR)
then
try
// PIDL des Arbeitsplatzes ermitteln, ...
SHGetSpecialFolderLocation(self.Handle,CSIDL_DRIVES,pidlRoot);
if(pidlRoot <>
nil)
then
begin
// ... & an ein IShellFolder-Interface binden, ...
if(iDesktop.BindToObject(pidlRoot,
nil,IID_IShellFolder,
iMyComputer) = S_OK)
then
begin
// ... & alle vorhandenen Objekte der Reihe nach durchlaufen
if(iMyComputer.EnumObjects(0,SHCONTF_FOLDERS
or SHCONTF_NONFOLDERS
or
SHCONTF_INCLUDEHIDDEN,ppEnum) = S_OK)
then
begin
while(ppEnum.Next(1,pidlItem,celtFetched) = S_OK)
and
(celtFetched = 1)
do
begin
// temporäre PIDL erzeugen, die für die Symbole gebraucht
// wird (s. Erklärung zu "SHGetFileInfo" im PSDK; relative
// PIDLs sind nicht erlaubt!)
tmp := AppendPIDL(pidlRoot,pidlItem);
// Eintrag & Symbol erzeugen
with lv.Items.Add
do
begin
// Entweder man nimmt die absolute PIDL, dann aber "iDesktop"
// zum Ermitteln des Namens
// Caption := GetDisplayName(iDesktop,tmp);
// oder die relative PIDL und "iMyComputer"
Caption := GetDisplayName(iMyComputer,pidlItem);
// für die Symbole ist aber auf jeden Fall die absolute PIDL
// erforderlich, sonst wird nichts angezeigt (speziell beim
// Arbeitsplatz ist mir das aufgefallen)
ImageIndex := GetShellImg(iDesktop,tmp,false);
end;
// PIDLs freigeben
pMalloc.Free(tmp); tmp :=
nil;
pMalloc.Free(pidlItem); pidlItem :=
nil;
end;
end;
end;
end;
// Arbeitsplatz-PIDL freigeben
if(pidlRoot <>
nil)
then pMalloc.Free(pidlRoot);
pidlRoot :=
nil;
finally
iDesktop :=
nil;
pMalloc :=
nil;
end;
finally
CoUninitialize;
end;
lv.Items.EndUpdate;
end;