Hallo,
folgender Code spuckt mir bei allen möglichen CSIDL_* Ordnern den Inhalt aus, ausgerechnet bei CSIDL_DRIVES (Arbeitsplatz) funktioniert es nicht. Dabei enthält EnumObjects die richtige Anzahl, die PIDLs stimmem auch, nur die Namen will er nicht ausspucken..
Falls Syntaxfehler drin sind, sorry, ich musste den Code abtippen.
Die benötigten Units sind natürlich alle eingebunden, wie gesagt es funktioniert mit allen anderen CSIDL_* die ich probiert habe.
Ach ja, in der StrRetToSTring wird der uType auf STREET_* getestet und dementsprechend behandelt, das Ding ist aus der ShellCtrls-
Unit !
Vielen Dank für Hilfe.
Delphi-Quellcode:
procedure TForm1.ShellListView1Click(Sender: TObject);
var
Allocator: IMalloc;
PDesktop, PSubfolder: IShellFolder;
PContent: IEnumIDList;
PIDL: PItemIDList
StrRet: TStrRet;
NumIDs: LongWord;
begin
if SHGetMalloc(Allocator) = NOERROR
then
begin
if (SHGetSpecialFolderLocation(
handle, CSIDL_DRIVES, PIDL) = S_OK)
and
(SHGetDesktopFolder(PDesktop) = S_OK)
then
try
begin
PDesktop.BindToObject(PIDL,
nil, IID_IShellFolder, Pointer(PSubFolder));
PSubFolder.EnumObjects(
handle, SHCONTF_FOLDERS
or SHCONTF_NONFOLDERS, PContent);
while PContent.Next(1, PIDL, NumIDs) <> S_FALSE
do
begin
FillChar(StrRet, SizeOf(StrRet), 0);
PDesktop.GetDisplayNameOf(PIDL, SHGDN_NORMAL, StrRet);
Memo1.Lines.Add(StrRetToString(PIDL, StrRet));
end;
end;
finally
//Hier noch Pointer und sonstigen Speicher freigeben..
end;
end;
end;