AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [Gelöst]Inhalt von Arbeitsplatz parsen und ausgeben
Thema durchsuchen
Ansicht
Themen-Optionen

[Gelöst]Inhalt von Arbeitsplatz parsen und ausgeben

Ein Thema von sieppl · begonnen am 19. Aug 2004 · letzter Beitrag vom 20. Aug 2004
Antwort Antwort
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#1

[Gelöst]Inhalt von Arbeitsplatz parsen und ausgeben

  Alt 19. Aug 2004, 12:09
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;
Sebastian
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Inhalt von Arbeitsplatz parsen und ausgeben

  Alt 19. Aug 2004, 15:31
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3

Re: Inhalt von Arbeitsplatz parsen und ausgeben

  Alt 19. Aug 2004, 21:37
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?

Schau einfach mal in die Prozedur "Scan". Dort findest du mit
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.
Angehängte Dateien
Dateityp: zip splitter2.zip (11,4 KB, 30x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#4

Re: Inhalt von Arbeitsplatz parsen und ausgeben

  Alt 20. Aug 2004, 09:38
@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;
Danke!
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 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