Erstellen von Symbolhandlern

Einem Dateityp ist häufig ein benutzerdefiniertes Symbol zugeordnet, damit seine Member in Windows Explorer leicht erkennbar sind. Die einfachste Möglichkeit, einem Dateityp ein benutzerdefiniertes Symbol zuzuweisen, besteht darin, die Datei des Symbols zu registrieren. Ein auf diese Weise registriertes Symbol ist jedoch für alle Member des Dateityps identisch. Sie können den Membern des Dateityps viel flexibler Symbole zuweisen, indem Sie einen Symbolhandler implementieren.

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

Die allgemeinen Verfahren zum Implementieren und Registrieren eines Shellerweiterungshandlers werden unter Erstellen von Shellerweiterungshandlern erläutert. Dieses Dokument konzentriert sich auf die Aspekte der Implementierung, die speziell für Symbolhandler gelten.

Anweisungen

Schritt 1: Implementieren von Symbolhandlern

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

Die Shell initialisiert den Handler über die IPersistFile-Schnittstelle . Diese Schnittstelle wird verwendet, um den Klassenbezeichner (CLSID) des Handlers anzufordern und mit dem Namen der Datei zu erhalten. Der rest des Vorgangs erfolgt über die IExtractIcon-Schnittstelle . Eine allgemeine Erläuterung zum Implementieren von Shellerweiterungshandlern, einschließlich der IPersistFile-Schnittstelle , finden Sie unter Erstellen von Shellerweiterungshandlern. 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 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 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 geeignete Werte zu. Wenn Sie keinen Dateinamen angeben möchten oder die Shell das Symbol nicht extrahieren soll, legen Sie das flag GIL_NOTFILENAME im parameter pwFlags 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 das flag GIL_DONTCACHE im pwFlags-Parameter fest. Wenn kein zwischengespeichertes Symbol geladen wird, ruft die Shell IExtractIcon::Extract auf, um das Symbolhandle anzufordern.

Wenn eine Datei und ein Index von IExtractIcon::GetIconLocation angegeben 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 extrahieren kann. Andernfalls muss der Handler große und kleine Symbole extrahieren oder anderweitig erstellen und seine HICON-Handles 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 ist 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, dessen 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 dessen Standardwert auf die Zeichenfolgenform der CLSID-GUID des Handlers fest. Eine allgemeine Erläuterung zum Registrieren von Shellerweiterungshandlern finden Sie unter Erstellen von Shellerweiterungshandlern.

Im folgenden Beispiel wird der Registrierungseintrag von Anpassen von Symbolen geändert, sodass 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