So erstellen Sie Symbolhandler

Ein Dateityp verfügt häufig über ein benutzerdefiniertes Symbol, das ihm zugeordnet ist, um seine Mitglieder in Windows Explorer leicht erkennbar zu machen. Die einfachste Möglichkeit zum Zuweisen eines benutzerdefinierten Symbols zu einem Dateityp besteht darin, die Datei des Symbols zu registrieren. Ein auf diese Weise registriertes Symbol ist jedoch für alle Mitglieder des Dateityps identisch. Sie können viel mehr Flexibilität beim Zuweisen von Symbolen zu den Mitgliedern des Dateityps haben, indem Sie einen Symbolhandler implementieren.

Ein Symbolhandler ist eine Art von Shell-Erweiterungshandler, mit dem Sie den Mitgliedern eines Dateityps dynamisch Symbole zuweisen können. Jedes Mal, wenn eine Datei des Typs angezeigt wird, fragt die Shell den Handler für das entsprechende Symbol ab. Ein Symbolhandler kann beispielsweise verschiedenen Elementen des Dateityps unterschiedliche Symbole zuweisen oder das Symbol je nach aktuellem Status der Datei variieren.

Die allgemeinen Verfahren zum Implementieren und Registrieren eines Shell-Erweiterungshandlers werden in der Erstellung von Shell-Erweiterungshandlern erläutert. Dieses Dokument konzentriert sich auf diese Aspekte der Implementierung, die speziell für Symbolhandler sind.

Instructions

Schritt 1: Implementieren von Symbolhandlern

Wie bei allen Shell-Erweiterungshandlern werden Symbolhandler als DLLs (Component Object Model) implementiert. Sie müssen zusätzlich zu IUnknown zwei Schnittstellen exportieren: IPersistFile und IExtractIcon.

Die Shell initialisiert den Handler über die IPersistFile-Schnittstelle . Es verwendet diese Schnittstelle, um den Klassenbezeichner des Handlers (CLSID) anzufordern und ihn mit dem Namen der Datei zu erhalten. Der Rest des Vorgangs erfolgt über die IExtractIcon-Schnittstelle . Eine allgemeine Diskussion über die Implementierung von Shell-Erweiterungshandlern, einschließlich der IPersistFile-Schnittstelle , finden Sie unter Erstellen von Shell-Erweiterungshandlern. Der Rest dieses Dokuments 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 anzufordern. 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 anzufordern. Legen Sie den Parameter "szIconFile " auf den Dateinamen fest. Wenn in der Datei mehrere Symbole vorhanden sind, legen Sie piIndex auf den Index des Symbols fest. Weisen Sie den beiden Flagvariablen geeignete Werte zu. Wenn Sie keinen Dateinamen angeben möchten oder die Shell das Symbol nicht extrahieren soll, legen Sie das GIL_NOTFILENAME Flag im PwFlags-Parameter fest. Sie müssen kein Wert zu szIconFile 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 das GIL_DONTCACHE Flag im PwFlags-Parameter fest. Wenn ein zwischengespeichertes Symbol nicht geladen wird, ruft die Shell IExtractIcon::Extract auf, um den Symbolhandpunkt anzufordern.

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

Schritt 3: Registrieren von Symbolhandlern

Wenn Sie ein Symbol für einen Dateitypstatisch registrieren, erstellen Sie einen DefaultIcon-Unterschlüssel unter der ProgID für den Dateityp. Der Standardwert wird auf die Datei festgelegt, die das Symbol enthält. Um einen Symbolhandler zu registrieren, müssen Sie weiterhin über den DefaultIcon-Unterschlüssel verfügen, der Standardwert muss jedoch auf "%1" festgelegt werden. Fügen Sie dem Shellex-Unterschlüssel des ProgID-Unterschlüssels einen IconHandler-Unterschlüssel hinzu, und legen Sie den Standardwert auf das Zeichenfolgenformular der CLSID-GUID des Handlers fest. Eine allgemeine Diskussion darüber, wie Shell-Erweiterungshandler registriert werden, finden Sie unter Erstellen von Shellerweiterungshandlern.

Im folgenden Beispiel wird der Registrierungseintrag aus dem Anpassen von Symbolen geändert, sodass der Dateityp "MYP" jetzt anstelle eines statisch definierten Symbols einen Kontextmenühandler 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