Registrieren von Shellerweiterungshandlern

Ein Shell-Erweiterungshandlerobjekt muss registriert werden, bevor es von der Shell verwendet werden kann. In diesem Thema wird allgemein erläutert, wie Sie einen Shell-Erweiterungshandler registrieren.

Jedes Mal, wenn Sie einen Shell-Erweiterungshandler erstellen oder ändern, ist es wichtig, das System darüber zu informieren, dass Sie eine Änderung vorgenommen haben. Rufen Sie dazu SHChangeNotify auf, und geben Sie das SHCNE_ASSOCCHANGED-Ereignis an. Wenn Sie SHChangeNotify nicht aufrufen, wird die Änderung möglicherweise erst erkannt, wenn das System neu gestartet wird.

Es gibt einige zusätzliche Faktoren, die für Windows 2000-Systeme gelten. Ausführliche Informationen finden Sie im Abschnitt Registrieren von Shell-Erweiterungshandlern unter Windows 2000-Systemen .

Wie bei allen COM-Objekten (Component Object Model) müssen Sie eine GUID für den Handler mithilfe eines Tools wie Guidgen.exe erstellen, das mit dem Windows Software Development Kit (SDK) bereitgestellt wird. Erstellen Sie einen Unterschlüssel unter HKEY_CLASSES_ROOT\CLSID , dessen Name die Zeichenfolgenform dieser GUID ist. Da es sich bei Shell-Erweiterungshandlern um Prozessserver handelt, müssen Sie auch einen InprocServer32-Unterschlüssel unter diesem GUID-Unterschlüssel erstellen, dessen Wert (Standard) auf den Pfad der DLL des Handlers festgelegt ist. Verwenden Sie das Apartmentthreadingmodell. Das folgende Beispiel soll dies erläutern:

HKEY_CLASSES_ROOT
   CLSID
      {00021500-0000-0000-C000-000000000046}
         InprocServer32
            (Default) = %windir%\System32\Example.dll
            ThreadingModel = Apartment

Jedes Mal, wenn die Shell eine Aktion ausführt, die einen Shell-Erweiterungshandler umfassen kann, überprüft sie den entsprechenden Registrierungsunterschlüssel. Der Unterschlüssel, unter dem ein Erweiterungshandler registriert ist, steuert, wenn er aufgerufen wird. Für instance ist es üblich, einen Kontextmenühandler namens zu verwenden, wenn die Shell ein Kontextmenü für ein Element eines Dateityps anzeigt. In diesem Fall muss der Handler unter dem ProgID-Unterschlüssel des Dateityps registriert werden.

In diesem Thema werden die folgenden Themen behandelt:

Handlernamen

Um einen Shell-Erweiterungshandler zu aktivieren, erstellen Sie einen Unterschlüssel mit dem Unterschlüsselnamen des Handlers (siehe unten) unter dem ShellEx-Unterschlüssel der ProgID (für Dateitypen) oder des Shell-Objekttypnamens (für predefined_shell_objects).

Wenn Sie beispielsweise einen Kontextmenüerweiterungshandler für MyProgram.1 registrieren möchten, erstellen Sie zunächst den folgenden Unterschlüssel:

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

Erstellen Sie für die folgenden Handler einen Unterschlüssel unter dem Unterschlüssel "Handler-Unterschlüsselname", der als Zeichenfolgenversion des Klassenbezeichners (CLSID) der Shell-Erweiterung benannt ist. Mehrere Erweiterungen können unter dem Unterschlüsselnamen des Handlers registriert werden, indem mehrere Unterschlüssel erstellt werden.

Handler Schnittstelle Name des Unterschlüssels des Handlers
Spaltenanbieterhandler IColumnProvider ColumnHandler
Kontextmenühandler IContextMenu ContextMenuHandlers
Copyhook-Handler ICopyHook CopyHookHandler
Drag & Drop-Handler IContextMenu DragDropHandler
Eigenschaftenblatthandler IShellPropSheetExt PropertySheetHandlers

 

Für die folgenden Handler ist der Standardwert des Schlüssels "Handlerunterschlüsselname" die Zeichenfolgenversion der CLSID der Shell-Erweiterung. Für diese Handler kann nur eine Erweiterung registriert werden.

Handler Schnittstelle Name des Unterschlüssels des Handlers
Datenhandler Idataobject Datahandler
Drop-Handler Idroptarget DropHandler
Symbolhandler IExtractIconA/W IconHandler
Miniaturbildhandler IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
QuickInfo-Handler IQueryInfo {00021500-0000-0000-C000-00000000046}
Shelllink (ANSI) IShellLinkA {000214EE-0000-0000-C000-00000000046}
Shelllink (UNICODE) IShellLinkW {000214F9-0000-0000-C000-000000000046}
Strukturierter Speicher IStorage {00000000B-0000-0000-C000-00000000046}
Metadaten IPropertySetStorage PropertyHandler
An das Startmenü anheften IStartMenuPinnedList {a2a9545d-a0c2-42b4-9708-a0b2badd77c8}
An Taskleiste anheften {90AA3A4E-1CBA-4233-B8BB-535773D4849}

 

Die angegebenen Unterschlüssel zum Hinzufügen von An das Startmenü anheften und an Taskleiste an das Kontextmenü eines Elements anheften sind nur für Dateitypen erforderlich, die den Eintrag IsShortCut enthalten.

Vordefinierte Shellobjekte

Die Shell definiert zusätzliche Objekte unter HKEY_CLASSES_ROOT die auf die gleiche Weise wie Dateitypen erweitert werden können. Um beispielsweise einen Eigenschaftenblatthandler für alle Dateien hinzuzufügen, können Sie sich unter dem Unterschlüssel PropertySheetHandlers registrieren.

HKEY_CLASSES_ROOT
   *
      shellex
         PropertySheetHandlers

Die folgende Tabelle enthält die verschiedenen Unterschlüssel von HKEY_CLASSES_ROOT , unter denen Erweiterungshandler registriert werden können. Beachten Sie, dass viele Erweiterungshandler nicht unter allen aufgeführten Unterschlüsseln registriert werden können. Weitere Informationen finden Sie in der Dokumentation des jeweiligen Handlers.

Unterschlüssel BESCHREIBUNG Mögliche Handler
* Alle Dateien Kontextmenü, Eigenschaftenblatt, Verben (siehe unten)
AllFileSystemObjects Alle Dateien und Dateiordner Kontextmenü, Eigenschaftenblatt, Verben
Ordner Alle Ordner Kontextmenü, Eigenschaftenblatt, Verben
Verzeichnis Dateiordner Kontextmenü, Eigenschaftenblatt, Verben
Verzeichnis\Hintergrund Hintergrund des Dateiordners Nur Kontextmenü
DesktopBackground Desktophintergrund (Windows 7 und höher) Kontextmenü, Verben
Laufwerk Alle Laufwerke in MyComputer, z. B. "C:\" Kontextmenü, Eigenschaftenblatt, Verben
Network Gesamtes Netzwerk (unter Meine Netzwerkplätze) Kontextmenü, Eigenschaftenblatt, Verben
Netzwerk\Typ\ # Alle Objekte vom Typ # (siehe unten) Kontextmenü, Eigenschaftenblatt, Verben
Netshare Alle Netzwerkfreigaben Kontextmenü, Eigenschaftenblatt, Verben
NetServer Alle Netzwerkserver Kontextmenü, Eigenschaftenblatt, Verben
network_provider_name Alle vom Netzwerkanbieter "network_provider_name" bereitgestellten Objekte Kontextmenü, Eigenschaftenblatt, Verben
Drucker Alle Drucker Kontextmenü, Eigenschaftenblatt
Audiocd Audio-CD im CD-Laufwerk Nur Verben
DVD DVD-Laufwerk (Windows 2000) Kontextmenü, Eigenschaftenblatt, Verben

 

Hinweise

  • Auf das Kontextmenü im Hintergrund des Dateiordners wird zugegriffen, indem sie mit der rechten Maustaste in einem Dateiordner, aber nicht über den Inhalt des Ordners klicken.
  • "Verben" sind spezielle Befehle, die unter HKEY_CLASSES_ROOT\Unterschlüssel-Shellverb\\ registriert sind.
  • Für Netzwerktyp\\# ist "#" ein Netzwerkanbietertypcode in dezimal. Der Netzwerkanbietertypcode ist das hohe Wort eines Netzwerktyps. Die Liste der Netzwerktypen wird in der Winnetwk.h-Headerdatei (WNNC_NET_*-Werte) angegeben. Beispielsweise ist WNNC_NET_SHIVA 0x00330000, sodass der entsprechende Typunterschlüssel HKEY_CLASSES_ROOT\Netzwerktyp\\51 lautet.
  • "network_provider_name" ist ein Netzwerkanbietername, der von WNetGetProviderName angegeben wird, wobei die Leerzeichen in Unterstriche konvertiert werden. Wenn beispielsweise der Microsoft-Netzwerkanbieter installiert ist, lautet sein Anbietername "Microsoft Windows-Netzwerk", und der entsprechende network_provider_name ist Microsoft_Windows_Network.

Beispiel für eine Erweiterungshandlerregistrierung

Um einen bestimmten Handler zu aktivieren, erstellen Sie einen Unterschlüssel unter dem Erweiterungshandlertyp mit dem Namen des Handlers. Die Shell verwendet nicht den Namen des Handlers, muss sich jedoch von allen anderen Namen unter diesem Typunterschlüssel unterscheiden. Legen Sie den Standardwert des Namensunterschlüssels auf die Zeichenfolgenform der GUID des Handlers fest.

Im folgenden Beispiel werden Registrierungseinträge veranschaulicht, die Kontextmenü- und Eigenschaftenblatterweiterungshandler mithilfe eines Beispiels für myp-Dateitypen aktivieren.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   CLSID
      {00000000-1111-2222-3333-444444444444}
         InProcServer32
            (Default) = C:\MyDir\MyCommand.dll
            ThreadingModel = Apartment
      {11111111-2222-3333-4444-555555555555}
         InProcServer32
            (Default) = C:\MyDir\MyPropSheet.dll
            ThreadingModel = Apartment
   MyProgram.1
      (Default) = MyProgram Application
      Shellex
         ContextMenuHandler
            MyCommand
               (Default) = {00000000-1111-2222-3333-444444444444}
         PropertySheetHandlers
            MyPropSheet
               (Default) = {11111111-2222-3333-4444-555555555555}

Initialisieren von Shellerweiterungshandlern