Wie bekomme ich angesichts eines Windows Vista oder neuerer IShellItem
den System-Image-Listen-Index, der diesem Objekt zugeordnet ist?
Zum Beispiel (Pseudocode) :
%Vor% 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 :
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 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:
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 :
IExtractIcon
. Gibt eine HICON
zurück. Benötigt IShellFolder
+ pidl. Wenn dies fehlschlägt, können Sie SHDefExtractIcon verwenden
SHDefExtractIcon
. Gibt eine HICON
zurück. Erfordert den vollständigen Pfad zur Symboldatei IThumbnailCache
. Benötigt IShellItem
. Gibt das Vorschaubild und nicht das Symbol IShellImageFactory
. Ruft eine Bitmap ab, die ein IShellItem
darstellt
IThumbnailProvider
. Windows Vista Ersatz für IExtractImage
IExtractImage
. Benötigt IShellFolder
+ pidl
. SHGetFileInfo
. Erfordert den vollständigen Dateipfad oder ein absolutes PIDL Keine von ihnen:
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:
Oder mit Raymond Chens Vorschlag:
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.
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).
Bei Ihrer großartigen Untersuchung haben Sie die IShellIcon-Schnittstelle vergessen. Es ist sogar in Windows XP verfügbar.
%Vor%