Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi [Gelöst]Inhalt von Arbeitsplatz parsen und ausgeben (https://www.delphipraxis.net/28074-%5Bgeloest%5Dinhalt-von-arbeitsplatz-parsen-und-ausgeben.html)

sieppl 19. Aug 2004 12:09


[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;

Christian Seehase 19. Aug 2004 15:31

Re: Inhalt von Arbeitsplatz parsen und ausgeben
 
Moin Sieppl,

das erste was mir auffällt:

Delphi-Quellcode:
if (SHGetSpecialFolderLocation(handle, CSIDL_DRIVES, PIDL) = S_OK) and
         (SHGetDesktopFolder(PDesktop) = S_OK) then
wenn SHGetSpecialFolderLocation erfolgreich war, und SHGetDesktopFolder fehlschlägt, wird PIDL nicht wieder freigegeben.
Da solltest Du die Struktur noch einmal überarbeiten.

MathiasSimmack 19. Aug 2004 21:37

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:

If the uFlags parameter includes the SHGFI_PIDL flag, this parameter must be the address of an ITEMIDLIST (PIDL) structure that contains the list of item identifiers that uniquely identifies the file within the Shell's namespace. The pointer to an item identifier list (PIDL) must be a fully qualified PIDL. Relative PIDLs are not allowed.
Inwieweit mein Weg aber korrekt ist, ... who knows? :oops:

Schau einfach mal in die Prozedur "Scan". Dort findest du mit
Delphi-Quellcode:
pidlRoot := AppendPIDL(pidlParent,pidlItem);
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.

Die Demo ist zwar nonVCL, aber das ändert ja nichts an den Shell-Zeilen.

sieppl 20. Aug 2004 09:38

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:
begin
  FillChar(StrRet, SizeOf(StrRet), 0);
  PDesktop.GetDisplayNameOf(PIDL, SHGDN_NORMAL, StrRet);
  Memo1.Lines.Add(StrRetToString(PIDL, StrRet));
end;
RICHTIG:
Delphi-Quellcode:
begin
  FillChar(StrRet, SizeOf(StrRet), 0);
  PSubFolder.GetDisplayNameOf(PIDL, SHGDN_NORMAL, StrRet);
  Memo1.Lines.Add(StrRetToString(PIDL, StrRet));
end;
:roteyes: Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz