Erstellen von Symbolhandlern

Einem Dateityp ist häufig ein benutzerdefiniertes Symbol zugeordnet, damit seine Member im Windows leicht erkennbar sind. Die einfachste Möglichkeit, einem Dateityp ein benutzerdefiniertes Symbol zu zuweisen, besteht in der Registrierung der Datei des Symbols. Ein auf diese Weise registriertes Symbol ist jedoch für alle Member des Dateityps identisch. Sie können den Membern des Dateityps viel mehr Flexibilität beim Zuweisen von Symbolen bieten, indem Sie einen Symbolhandler implementieren.

Ein Symbolhandler ist ein Typ von Shell-Erweiterungshandler, mit dem Sie den Membern eines Dateityps Symbole dynamisch zuweisen können. Jedes Mal, wenn eine Datei des Typs angezeigt wird, fragt die Shell den Handler nach dem entsprechenden Symbol ab. Beispielsweise kann ein Symbolhandler verschiedenen Membern des Dateityps verschiedene Symbole zuweisen oder das Symbol basierend auf dem aktuellen Zustand der Datei ändern.

Die allgemeinen Verfahren zum Implementieren und Registrieren eines Shell-Erweiterungshandlers werden unter Creating Shell Extension Handlers (Erstellen von Shellerweiterungshandlern) erläutert. Dieses Dokument konzentriert sich auf die Aspekte der Implementierung, die spezifisch für Symbolhandler sind.

Instructions

Schritt 1: Implementieren von Symbolhandlern

Wie alle Shell-Erweiterungshandler sind Symbolhandler In-Process-Component Object Model (COM)-Objekte, die als DLLs implementiert sind. Sie müssen zusätzlich zu IUnknownzwei Schnittstellen exportieren: IPersistFile und IExtractIcon.

Die Shell initialisiert den Handler über die IPersistFile-Schnittstelle. Sie verwendet diese Schnittstelle, um den Klassenbezeichner (CLSID) des Handlers an fordern und mit dem Namen der Datei zur Verfügung zu stellen. Der Rest des Vorgangs erfolgt über die IExtractIcon-Schnittstelle. Eine allgemeine Erörterung der Implementierung von Shell-Erweiterungshandlern, einschließlich der IPersistFile-Schnittstelle, finden Sie unter Creating Shell Extension Handlers. Im weiteren Verlauf dieses Dokuments wird erläutert, wie die IExtractIcon-Schnittstelle implementiert wird.

Schritt 2: Implementieren der IExtractIcon-Schnittstelle

Nachdem die Schnittstelle initialisiert wurde, verwendet die Shell die IExtractIcon-Schnittstelle des Handlers, um das entsprechende Symbol an fordern. Die Schnittstelle verfügt über zwei Methoden: IExtractIcon::GetIconLocation und IExtractIcon::Extract.

Symbole werden anhand ihres Speicherorts im Dateisystem identifiziert. Die IExtractIcon::GetIconLocation-Methode wird aufgerufen, um diese Informationen an fordern. Legen Sie den szIconFile-Parameter auf den Dateinamen fest. Wenn die Datei mehrere Symbole enthält, legen Sie piIndex auf den Index des Symbols fest. Weisen Sie den beiden Flagvariablen entsprechende Werte zu. Wenn Sie keinen Dateinamen angeben möchten oder wenn Sie nicht möchten, dass die Shell das Symbol extrahiert, legen Sie das FLAG FÜR DIE _ NOTFILENAME im pwFlags-Parameter fest. Sie müssen szIconFile keinen Wert zuweisen, aber der Handler muss Symbolhandles bereitstellen, wenn die Shell IExtractIcon::Extract aufruft.

Wenn Sie einen Dateinamen zurückgeben, versucht die Shell normalerweise, das Symbol aus dem Cache zu laden. Um das Laden eines zwischengespeicherten Symbols zu verhindern, legen Sie im pwFlags-Parameter das FLAG FÜR DIE _ DONTCACHE fest. Wenn ein zwischengespeichertes Symbol nicht geladen wird, ruft die Shell dann IExtractIcon::Extract auf, um das Symbolhand handle an fordern.

Wenn eine Datei und ein Index von IExtractIcon::GetIconLocationangegeben wurden, werden sie in den Parametern pszFile bzw. nIconIndex an IExtractIcon::Extract übergeben. Wenn ein Dateiname angegeben wird, kann der Handler S FALSE zurückgeben, damit _ die Shell das Symbol extrahiert. Andernfalls muss der Handler große und kleine Symbole extrahieren oder anderweitig erzeugen und die HICON-Handles den Parametern phiconLarge und phiconSmall zuweisen. Die Shell fügt dem Cache die Symbole hinzu, um nachfolgende Aufrufe des Handlers zu beschleunigt.

Schritt 3: Registrieren von Symbolhandlern

Wenn Sie statisch ein Symbol für einen Dateityp registrieren,erstellen Sie einen DefaultIcon-Unterschlüssel unter der ProgID für den Dateityp. Der Standardwert ist auf die Datei festgelegt, die das Symbol enthält. Um einen Symbolhandler zu registrieren, müssen Sie weiterhin über den Unterschlüssel DefaultIcon verfügen, aber der Standardwert muss auf "%1" festgelegt werden. Fügen Sie dem Shellex-Unterschlüssel des Unterschlüssels ProgID einen IconHandler-Unterschlüssel hinzu, und legen Sie den Standardwert auf die Zeichenfolgenform der CLSID-GUID des Handlers fest. Eine allgemeine Erörterung des Registrierens von Shell-Erweiterungshandlern finden Sie unter Creating Shell Extension Handlers.

Im folgenden Beispiel wird der Registrierungseintrag von Customizing Icons (Anpassen von Symbolen) so verändert, dass der .myp-Dateityp jetzt einen Kontextmenühandler anstelle eines statisch definierten Symbols verwendet.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = %1
      Shellex
         IconHandler
            (Default) = {The handler's CLSID GUID}

Erstellen von Shellerweiterungshandlern

Ipersistfile

IExtractIcon