So erhalten Sie den Systemabbildlistensymbolindex eines IShellItem?

8

Wie bekomme ich angesichts eines Windows Vista oder neuerer IShellItem den System-Image-Listen-Index, der diesem Objekt zugeordnet ist?

Zum Beispiel (Pseudocode) :

%Vor%

Hintergrund

In früheren Zeiten (Windows 95 und neuer) konnten wir die Shell bitten, den System-Imagelist-Index für das Symbol eines Objekts anzugeben. Wir haben es mit SHGetFileInfo . Die SHGetFileInfo-Funktion ruft das Symbol ab, indem sie den Shell-Namespace nach dem Symbolindex in der System-Image-Liste fragt :

%Vor%

Dies funktioniert, wenn Sie ein Element im Shell-Namespace verwenden, der einer Datei entspricht. Aber die Shell unterstützt Dinge neben Dateien und Ordnern im Dateisystem.

Symbol-Index von IShellFolder

Die allgemeine Lösung zum Abrufen von Informationen zu einem Objekt im Shell-Namespace ergibt sich aus der Verwendung der Art, wie Sie ein -Element im Shell-Namespace darstellen:

  • IShellFolder : Der Ordner, in dem sich das Ding befindet, zusammen mit
  • child PIDL : Die ID der Sache in diesem Ordner

Daraus ergeben sich Möglichkeiten, den Index der Systembildliste zu erhalten :

%Vor%

Aber IShellFolder ist out; Wir verwenden IShellItem jetzt

Ab Windows Vista wurde IShellItem zu der bevorzugte AP ich für die Navigation der Shell. Die Windows 95-Ära-API, in der ein IShellFolder + pidl -Paar um bestehen musste sperrig und fehleranfällig .

Die Frage wird: Wie macht man damit was? Insbesondere, wie bekomme ich den Bildindex in der Systembildliste des Artikels? Wenn man seine Methoden betrachtet, gibt es nicht einmal eine Möglichkeit, sein absolutes Pidl zu erhalten:

  • BindToHandler : Bindet an einen Handler für ein Element, wie durch den Handler-ID-Wert (BHID) angegeben.
  • Vergleichen : Vergleicht zwei IShellItem-Objekte.
  • GetAttributes : Ruft eine angeforderte Gruppe von Attributen des IShellItem-Objekts ab.
  • GetDisplayName : Ruft den Anzeigenamen des IShellItem-Objekts ab.
  • GetParent : Ruft das übergeordnete Element eines IShellItem-Objekts ab.

Ich hatte gehofft, dass Windows-Eigenschaft System , erreichbar über IShellItem2 , würde eine Eigenschaft mit dem Shell-Imagelist-Symbolindex verknüpft sein. Leider sehe ich keine:

Wege zum Extrahieren von Symbolen

Dort gibt viele Standardmethoden , um das Bild zu erhalten, das mit einer Sache im Windows Shell-Namespace einhergeht :

Keine von ihnen:

  • nimm ein IShellItem
  • gibt einen Index zurück
Ian Boyd 19.02.2016, 04:46
quelle

2 Antworten

3

Grundsätzlich scheint es keine einfache Methode dafür zu geben. Es wurde einfach nicht in der API bereitgestellt.

In Ihrer Frage sagen Sie "Aber die Shell unterstützt Dinge neben Dateien und Ordnern im Dateisystem." , was mich denken lässt, dass Sie übersehen haben, dass SHGetFileInfo tatsächlich die direkte Verwendung von PIDLs unterstützt (mit Das SHGFI_PIDL -Flag) - also kann auf Nicht-Dateisystem-Objekten verwendet werden. Wenn Sie immer noch die volle PIDL haben, ist dies der einfachste Weg, einen Icon-Index zu bekommen, ansonsten sollte so etwas funktionieren:

%Vor%

Oder mit Raymond Chens Vorschlag:

%Vor%

Stellt sich heraus, dass IShellFolder manchmal IShellIcon nicht unterstützt. Zum Beispiel versuchen, in einer Zip-Datei zu suchen. Wenn dies geschieht, schlägt der QueryInterface von IShellFolder für IShellIcon fehl.

%Vor%

Doch SHGetFileInfo weiß, wie man damit umgeht.

Am besten versuchen Sie nicht, eine IShellIcon -Schnittstelle selbst zu bekommen. Belassen Sie die Schwerarbeit auf SHGetFileInfo (zumindest bis jemand von Microsoft dokumentiert, wie IShellIcon zu verwenden ist).

    
Jonathan Potter 19.02.2016, 05:17
quelle
1

Bei Ihrer großartigen Untersuchung haben Sie die IShellIcon-Schnittstelle vergessen. Es ist sogar in Windows XP verfügbar.

%Vor%     
Denis Anisimov 19.02.2016 13:55
quelle

Tags und Links