![]() |
[Gelöst]Inhalt von Arbeitsplatz parsen und ausgeben
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.. :wall: 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; |
Re: Inhalt von Arbeitsplatz parsen und ausgeben
Moin Sieppl,
das erste was mir auffällt:
Delphi-Quellcode:
wenn SHGetSpecialFolderLocation erfolgreich war, und SHGetDesktopFolder fehlschlägt, wird PIDL nicht wieder freigegeben.
if (SHGetSpecialFolderLocation(handle, CSIDL_DRIVES, PIDL) = S_OK) and
(SHGetDesktopFolder(PDesktop) = S_OK) then Da solltest Du die Struktur noch einmal überarbeiten. |
Re: Inhalt von Arbeitsplatz parsen und ausgeben
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe zwar von der Shell-Programmierung nicht so viel Ahnung, aber wann hätte mich so eine Lappalie je aufgehalten? ;) Da ich mit der Splitter-Demo, die ich vor einiger Zeit schon mal irgendwo angehangen habe, ein Shell-Sample habe, habe ich ein bisschen damit herumgespielt und den Inhalt vom Arbeitsplatz angezeigt bekommen.
Die Demo möchte ich aber unter Vorbehalt weitergeben. Wie gesagt, ganz firm bin ich nicht. Und evtl. ist es auch nur ein Bug bzw. Denkfehler meinerseits, aber -- Die Objekte ließen sich ja relativ simpel auslesen. Aber als Symbole wurden stets nur Ordner angezeigt. Das Problem löste sich, nachdem ich eine neue PIDL (basierend auf dem Parent und dem jeweils aktuellen Objekt) generiert habe. Und in der Funktion "SHGetFileInfo", die ich für die Symbole benutzt habe, heißt es ja auch, es wird eine absolute PIDL gebraucht, wenn man eine solche zum Ermitteln der Symbole verwenden möchte: Zitat:
Schau einfach mal in die Prozedur "Scan". Dort findest du mit
Delphi-Quellcode:
die Zeile, wo ich besagte neue PIDL generiert habe. Diese wird mit der PIDL des jeweiligen Objektes an die Prozedur "CreateListItem" übergeben. Wie gesagt: mit "pidlItem" kam ich zwar an den Namen ran, aber das Symbol war falsch. Und "pidlRoot" zeigte zwar das richtige Symbol, allerdings keinen Namen. Darum beides.
pidlRoot := AppendPIDL(pidlParent,pidlItem);
Die Demo ist zwar nonVCL, aber das ändert ja nichts an den Shell-Zeilen. |
Re: Inhalt von Arbeitsplatz parsen und ausgeben
@Matthias: Danke! Damit sollte ich auf jeden Fall etwas anfangen können. Zumindest werde ich den Bug in meinem Code finden..
EDIT: FALSCH:
Delphi-Quellcode:
RICHTIG:
begin
FillChar(StrRet, SizeOf(StrRet), 0); PDesktop.GetDisplayNameOf(PIDL, SHGDN_NORMAL, StrRet); Memo1.Lines.Add(StrRetToString(PIDL, StrRet)); end;
Delphi-Quellcode:
:roteyes: Danke!
begin
FillChar(StrRet, SizeOf(StrRet), 0); PSubFolder.GetDisplayNameOf(PIDL, SHGDN_NORMAL, StrRet); Memo1.Lines.Add(StrRetToString(PIDL, StrRet)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz