Erstellen von Shellerweiterungshandlern

Die Funktionen der Shell können mit Registrierungseinträgen und .ini Dateien erweitert werden. Obwohl dieser Ansatz zum Erweitern der Shell einfach ist und für viele Zwecke angemessen ist, ist es begrenzt. Wenn Sie beispielsweise die Registrierung verwenden, um ein benutzerdefiniertes Symbol für einen Dateityp anzugeben, wird für jede Datei dieses Typs dasselbe Symbol angezeigt. Durch das Erweitern der Shell mit der Registrierung können Sie das Symbol für verschiedene Dateien desselben Typs nicht variieren. Andere Aspekte der Shell, z. B. das Eigenschafteneigenschaftenblatt , das angezeigt werden kann, wenn eine Datei mit der rechten Maustaste geklickt wird, kann überhaupt nicht mit der Registrierung geändert werden.

Ein leistungsstarker und flexiblerer Ansatz zum Erweitern der Shell besteht darin, Shell-Erweiterungshandler zu implementieren. Diese Handler können für eine Vielzahl von Aktionen implementiert werden, die die Shell ausführen kann. Bevor Sie die Aktion ausführen, fragt die Shell den Erweiterungshandler ab, sodass die Aktion geändert werden kann. Ein gängiges Beispiel ist ein Kontextmenüerweiterungshandler. Wenn eine für einen Dateityp implementiert ist, wird sie jedes Mal abgefragt, wenn eine der Dateien mit der rechten Maustaste geklickt wird. Der Handler kann dann zusätzliche Menüelemente auf Datei-nach-Datei-Basis angeben, anstatt denselben Satz für den gesamten Dateityp festzulegen.

In diesem Dokument wird erläutert, wie Sie die Erweiterungshandler implementieren, mit denen Sie eine Vielzahl von Shellaktionen ändern können. Die folgenden Handler sind einem bestimmten Dateityp zugeordnet und ermöglichen es Ihnen, auf Datei-nach-Datei-Basis anzugeben:

Handler BESCHREIBUNG
Kontextmenühandler Wird aufgerufen, bevor das Kontextmenü einer Datei angezeigt wird. Sie können dem Kontextmenü elemente auf Datei-nach-Datei-Basis hinzufügen.
Datenhandler Wird aufgerufen, wenn ein Drag-and-Drop-Vorgang für DragShell-Objekte ausgeführt wird. Es ermöglicht Ihnen, zusätzliche Zwischenablageformate für das Dropziel bereitzustellen.
Drop-Handler Wird aufgerufen, wenn ein Datenobjekt über eine Datei gezogen oder abgelegt wird. Es ermöglicht Ihnen, eine Datei in ein Dropziel zu erstellen.
Symbolhandler Wird aufgerufen, bevor das Symbol einer Datei angezeigt wird. Sie können das Standardsymbol der Datei durch ein benutzerdefiniertes Symbol auf Dateibasis ersetzen.
Eigenschaftenblatthandler Wird aufgerufen, bevor das Eigenschaftenblatt eines Objekts angezeigt wird. Sie können Seiten hinzufügen oder ersetzen.
Miniaturbildhandler Stellt ein Bild bereit, das das Element darstellt.
QuickInfo-Handler Stellt Popuptext bereit, wenn der Benutzer den Mauszeiger über das Objekt bewegt.
Metadatenhandler Stellt Lese- und Schreibzugriff auf Metadaten (Eigenschaften) bereit, die in einer Datei gespeichert sind. Dies kann verwendet werden, um die Detailansicht, Infoinfos, die Eigenschaftenseite und die Gruppierungsfeatures zu erweitern.

 

Andere Handler sind nicht einem bestimmten Dateityp zugeordnet, werden jedoch vor einigen Shell-Vorgängen aufgerufen:

Handler BESCHREIBUNG
Spaltenhandler Wird von Windows Explorer aufgerufen, bevor die Detailansicht eines Ordners angezeigt wird. Sie können der Detailansicht benutzerdefinierte Spalten hinzufügen.
Kopieren des Hook-Handlers Wird aufgerufen, wenn ein Ordner oder Druckerobjekt verschoben, kopiert, gelöscht oder umbenannt werden soll. Es ermöglicht Ihnen, den Vorgang zu genehmigen oder zu veto.
Drag & Drop-Handler Wird aufgerufen, wenn eine Datei mit der rechten Maustaste gezogen wird. Sie können das angezeigte Kontextmenü ändern.
Symbolüberlagerungshandler Wird aufgerufen, bevor das Symbol einer Datei angezeigt wird. Sie können eine Überlagerung für das Symbol der Datei angeben.
Suchhandler Wird aufgerufen, um eine Suchmaschine zu starten. Sie können eine benutzerdefinierte Suchmaschine implementieren, auf die über das Startmenü oder Windows Explorer zugegriffen werden kann.

 

Die Details zum Implementieren bestimmter Erweiterungshandler werden in den oben aufgeführten Abschnitten behandelt. Der Rest dieses Dokuments behandelt einige Implementierungsprobleme, die allen Shell-Erweiterungshandlern gemeinsam sind.

Implementieren von Shell-Erweiterungshandlern

Ein Großteil der Implementierung eines Shell-Erweiterungshandlerobjekts hängt vom Typ ab. Es gibt jedoch einige gängige Elemente. In diesem Abschnitt werden diese Aspekte der Implementierung erläutert, die von allen Shell-Erweiterungshandlern freigegeben werden.

Viele Shell-Erweiterungshandler sind In-Process Component Object Model (COM)-Objekte. Sie müssen einer GUID zugewiesen und registriert werden, wie in der Registrierung von Shellerweiterungshandlern beschrieben. Sie werden als DLLs implementiert und müssen die folgenden Standardfunktionen exportieren:

  • DllMain. Der Standardeintragspunkt für die DLL.
  • DllGetClassObject. Macht die Klassenfabrik des Objekts verfügbar.
  • DllCanUnloadNow. COM ruft diese Funktion auf, um zu ermitteln, ob das Objekt clients bereitstellt. Wenn dies nicht der Fall ist, kann das System die DLL entladen und den zugehörigen Speicher freigeben.

Wie bei allen COM-Objekten müssen Shellerweiterungshandler eine IUnknown-Schnittstelle und eine Klassenfabrik implementieren. Die meisten Erweiterungshandler müssen auch eine IPersistFile- oder IShellExtInit-Schnittstelle in Windows XP oder früher implementieren. Diese wurden durch IInitializeWithStream, IInitializeWithItem und IInitializeWithFile in Windows Vista ersetzt. Die Shell verwendet diese Schnittstellen, um den Handler zu initialisieren.

Die IPersistFile-Schnittstelle muss wie folgt implementiert werden:

  • Datenhandler
  • Drop-Handler

In der Vergangenheit wurden auch Symbolhandler zum Implementieren von IPersistFile benötigt, dies gilt jedoch nicht mehr. Für Symbolhandler ist IPersistFile jetzt optional und andere Schnittstellen wie IInitializeWithItem werden bevorzugt.

Die IShellExtInit-Schnittstelle muss wie folgt implementiert werden:

  • Kontextmenühandler
  • Drag-and-Drop-Handler
  • Eigenschaftenblatthandler

Implementieren von IPersistFile

Die IPersistFile-Schnittstelle soll zulassen, dass ein Objekt aus einer Datenträgerdatei geladen oder gespeichert werden kann. Es verfügt über sechs Methoden zusätzlich zu IUnknown, fünf seiner eigenen und die GetClassID-Methode , die sie von IPersist erbt. Bei Shell-Erweiterungen wird IPersist nur zum Initialisieren eines Shell-Erweiterungshandlerobjekts verwendet. Da in der Regel kein Lese- oder Schreibzugriff auf den Datenträger erforderlich ist, erfordern nur die GetClassID - und Load-Methoden eine Nichttokenimplementierung.

Die Shell ruft GetClassID zuerst auf, und die Funktion gibt den Klassenbezeichner (CLSID) des Erweiterungshandlerobjekts zurück. Die Shell ruft dann Load auf und übergibt zwei Werte. Der erste , pszFileName, ist eine Unicode-Zeichenfolge mit dem Namen der Datei oder des Ordners, auf der Shell ausgeführt werden soll. Die zweite ist dwMode, die den Dateizugriffsmodus angibt. Da in der Regel kein Zugriff auf Dateien erforderlich ist, ist dwMode in der Regel null. Die Methode speichert diese Werte nach Bedarf für einen späteren Verweis.

Das folgende Codefragment veranschaulicht, wie ein typischer Shell-Erweiterungshandler die GetClassID - und Load-Methoden implementiert. Es wurde entwickelt, um ANSI oder Unicode zu behandeln. CLSID_SampleExtHandler ist die GUID des Erweiterungshandlerobjekts, und CSampleExtHandler ist der Name der Klasse, die zum Implementieren der Schnittstelle verwendet wird. Die variablen m_szFileName und m_dwMode sind private Variablen, die verwendet werden, um den Namen und die Zugriffskennzeichnungen der Datei zu speichern.

wchar_t m_szFileName[MAX_PATH];    // The file name
DWORD m_dwMode;                  // The file access mode

CSampleExtHandler::GetClassID(CLSID *pCLSID)
{
    *pCLSID = CLSID_SampleExtHandler;
}

CSampleExtHandler::Load(PCWSTR pszFile, DWORD dwMode)
{
    m_dwMode = dwMode;
    return StringCchCopy(_szFileName, ARRAYSIZE(m_szFileName), pszFile);
}

Implementieren von IShellExtInit

Die IShellExtInit-Schnittstelle verfügt über nur eine Methode, IShellExtInit::Initialize, zusätzlich zu IUnknown. Die Methode verfügt über drei Parameter, mit denen die Shell verschiedene Informationstypen übergeben kann. Die übergebenen Werte hängen vom Typ des Handlers ab, und einige können auf NULL festgelegt werden.

  • pIDFolder enthält den Zeiger eines Ordners auf eine Elementbezeichnerliste (PIDL). Bei Eigenschaftenblatterweiterungen ist er NULL. Bei Kontextmenüerweiterungen handelt es sich um die PIDL des Ordners, der das Element enthält, dessen Kontextmenü angezeigt wird. Bei Nichtdefault-Drag-and-Drop-Handlern handelt es sich um die PIDL des Zielordners.
  • pDataObject enthält einen Zeiger auf die IDataObject-Schnittstelle eines Datenobjekts . Das Datenobjekt enthält mindestens einen Dateinamen im CF_HDROP Format.
  • hRegKey enthält einen Registrierungsschlüssel für das Dateiobjekt oder den Ordnertyp.

Die IShellExtInit::Initialize-Methode speichert den Dateinamen, den IDataObject-Zeiger und den Registrierungsschlüssel bei bedarf der späteren Verwendung. Das folgende Codefragment veranschaulicht eine Implementierung von IShellExtInit::Initialize. Aus Gründen der Einfachheit wird in diesem Beispiel davon ausgegangen, dass das Datenobjekt nur eine einzelne Datei enthält. Im Allgemeinen kann es mehrere Dateien enthalten, die jeweils extrahiert werden müssen.

LPCITEMIDLIST  m_pIDFolder;           //The folder's PIDL
wchar_t        m_szFile[MAX_PATH];    //The file name
IDataObject   *m_pDataObj;            //The IDataObject pointer
HKEY           m_hRegKey;             //The file or folder's registry key

STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, 
                                   IDataObject *pDataObj, 
                                   HKEY hRegKey) 
{ 
    // If Initialize has already been called, release the old PIDL
    ILFree(m_pIDFolder);
    m_pIDFolder = nullptr;

    // Store the new PIDL.
    if (pIDFolder)
    {
        m_pIDFolder = ILClone(pIDFolder);
    }
    
    // If Initialize has already been called, release the old
    // IDataObject pointer.
    if (m_pDataObj)
    { 
        m_pDataObj->Release(); 
    }
     
    // If a data object pointer was passed in, save it and
    // extract the file name. 
    if (pDataObj) 
    { 
        m_pDataObj = pDataObj; 
        pDataObj->AddRef(); 
      
        STGMEDIUM   medium;
        FORMATETC   fe = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
        UINT        uCount;

        if (SUCCEEDED(m_pDataObj->GetData(&fe, &medium)))
        {
            // Get the count of files dropped.
            uCount = DragQueryFile((HDROP)medium.hGlobal, (UINT)-1, NULL, 0);

            // Get the first file name from the CF_HDROP.
            if (uCount)
                DragQueryFile((HDROP)medium.hGlobal, 0, m_szFile, 
                              sizeof(m_szFile)/sizeof(TCHAR));

            ReleaseStgMedium(&medium);
        }
    }

    // Duplicate the registry handle. 
    if (hRegKey) 
        RegOpenKeyEx(hRegKey, nullptr, 0L, MAXIMUM_ALLOWED, &m_hRegKey); 
    return S_OK; 
}

CSampleExtHandler ist der Name der Klasse, die zum Implementieren der Schnittstelle verwendet wird. Die variablen m_pIDFolder, m_pDataObject, m_szFileName und m_hRegKey sind private Variablen, die zum Speichern der informationen verwendet werden, die übergeben werden. In diesem Beispiel wird davon ausgegangen, dass nur ein Dateiname vom Datenobjekt gehalten wird. Nachdem die FORMATETC-Struktur aus dem Datenobjekt abgerufen wurde, wird DragQueryFile verwendet, um den Dateinamen aus dem medium.hGlobal-Element der FORMATTC-Struktur zu extrahieren. Wenn ein Registrierungsschlüssel übergeben wird, verwendet die Methode RegOpenKeyEx , um den Schlüssel zu öffnen und dem Handle m_hRegKey zuzuweisen.

Infoinfo-Anpassung

Es gibt zwei Möglichkeiten zum Anpassen von Infoinfos:

  • Implementieren Sie ein Objekt, das IQueryInfo unterstützt, und registrieren Sie dieses Objekt dann unter dem richtigen Unterschlüssel in der Registrierung (siehe Registrieren von Shell-Erweiterungshandlern unten).
  • Geben Sie eine feste Zeichenfolge oder eine Liste der anzuzeigenden Dateieigenschaften an.

Um eine feste Zeichenfolge für eine Namespaceerweiterung anzuzeigen, erstellen Sie einen Eintrag, der im {CLSID}-Schlüssel Ihrer Namespaceerweiterung aufgerufen InfoTip wird. Legen Sie den Wert dieses Eintrags so fest, dass sie entweder die literale Zeichenfolge sein soll, die sie anzeigen möchten, wie in diesem Beispiel gezeigt, oder eine indirekte Zeichenfolge, die eine Ressource und einen Index innerhalb dieser Ressource angibt (für Lokalisierungszwecke).

HKEY_CLASSES_ROOT
   CLSID
      {CLSID}
         InfoTip = InfoTip string for your namespace extension

Um eine feste Zeichenfolge für einen Dateityp anzuzeigen, erstellen Sie einen Eintrag, der im ProgID-Schlüssel dieses Dateityps aufgerufen InfoTip wird. Legen Sie den Wert dieses Eintrags fest, um entweder die Literalzeichenfolge anzuzeigen oder eine indirekte Zeichenfolge, die eine Ressource und einen Index innerhalb dieser Ressource (für Lokalisierungszwecke) angibt, wie in diesem Beispiel gezeigt.

HKEY_CLASSES_ROOT
   ProgID
      InfoTip = Resource.dll, 3

Wenn die Shell bestimmte Dateieigenschaften in der Infoinfo für einen bestimmten Dateityp anzeigen soll, erstellen Sie einen Eintrag, der im ProgID-Schlüssel für diesen Dateityp aufgerufen InfoTip wird. Legen Sie den Wert dieses Eintrags fest, um eine semikolonsdelineierte Liste von kanonischen Eigenschaftennamen, Formatbezeichner (FMTID)/Property Identifier (PID)-Paaren oder beides zu sein. Dieser Wert muss mit "prop:" beginnen, um ihn als Eigenschaftslistenzeichenfolge zu identifizieren. Wenn Sie "prop:" weglassen, wird der Wert als Literalzeichenfolge und als solche angezeigt.

Im folgenden Beispiel ist propname ein kanonischer Eigenschaftsname (z. B. System.Date) und {fmtid}, pid ist ein FMTID/PID-Paar.

HKEY_CLASSES_ROOT
   ProgID
      InfoTip = prop:propname;propname;{fmtid},pid;{fmtid},pid

Die folgenden Eigenschaftennamen können verwendet werden:

Eigenschaftenname Beschreibung Abgerufen von
Autor Autor des Dokuments PIDSI_AUTHOR
Titel Titel des Dokuments PIDSI_TITLE
Subject Betreffzusammenfassung PIDSI_SUBJECT
Comment Dokumentkommentare PIDSI_COMMENT - oder Ordner-/Treibereigenschaften
PageCount Anzahl von Seiten PIDSI_PAGECOUNT
Name Angezeigter Name Standardordneransicht
OriginalLocation Speicherort der ursprünglichen Datei Ordner "Briefbuchstaben" und "Papierkorb"
DateDeleted Datumsdatei wurde gelöscht Papierkorbordner
type Dateityp Standardordnerdetailseite
Größe Größe der Datei Standardordnerdetailseite
SyncCopyIn Identisch mit OriginalLocation Identisch mit OriginalLocation
Geändert Datum der letzten Änderung Standardordnerdetailseite
Erstellt Erstellungsdatum Standardordnerdetailseite
Zugegriffen Datum der letzten Zugriffe Standardordnerdetailseite
InFolder Verzeichnis, das die Datei enthält Dokumentsuchergebnisse
Rang Qualität der Such übereinstimmung Dokumentsuchergebnisse
FreeSpace Verfügbarer Speicherplatz Laufwerke
NumberOfVisits Anzahl von Aufrufen Favoritenordner
Attribute Dateiattribute Standardordnerdetailseite
Company Unternehmensname PIDDSI_COMPANY
Category Dokumentkategorie PIDDSI_CATEGORY
Copyright Medienrecht PIDMSI_COPYRIGHT
HTMLInfoTipFile HTML-Infoinfodatei Desktop.ini Datei für Ordner

 

Verbessern der Windows Suche mit Shell-Erweiterungshandlern

Shellerweiterungshandler können verwendet werden, um die Benutzerfreundlichkeit zu verbessern, die von einem Windows Suchprotokollhandler bereitgestellt wird. Um solche Verbesserungen zu ermöglichen, muss der unterstützende Shell-Erweiterungshandler so konzipiert sein, dass er in den Suchprotokollhandler als Datenquelle integriert werden kann. Informationen zum Verbessern eines Windows Suchprotokollhandlers durch Integration in einen Shell-Erweiterungshandler finden Sie unter Hinzufügen von Symbolen, Vorschauen und Kontextmenüs. Weitere Informationen zu Windows Suchprotokollhandlern finden Sie unter Entwickeln von Protokollhandlern.

Registrieren von Shell-Erweiterungshandlern

Ein Shell-Erweiterungshandlerobjekt muss registriert werden, bevor die Shell sie verwenden kann. In diesem Abschnitt wird allgemein erläutert, wie Sie einen Shell-Erweiterungshandler registrieren.

Wenn Sie einen Shell-Erweiterungshandler erstellen oder ändern, ist es wichtig, das System zu benachrichtigen, dass Sie eine Änderung mit SHChangeNotify vorgenommen haben, indem Sie das SHCNE_ASSOCCHANGED-Ereignis angeben. Wenn Sie SHChangeNotify nicht aufrufen, wird die Änderung möglicherweise erst erkannt, wenn das System neu gestartet wird.

Wie bei allen COM-Objekten müssen Sie eine GUID für den Handler mithilfe eines Tools wie UUIDGEN.exe erstellen. Erstellen Sie einen Schlüssel unter HKEY_CLASSES_ROOT\CLSID, dessen Name die Zeichenfolgenform der GUID ist. Da Shellerweiterungshandler In-Process-Server sind, müssen Sie einen InProcServer32-Schlüssel unter dem GUID-Schlüssel erstellen, wobei der Standardwert auf den Pfad der DLL des Handlers festgelegt ist. Verwenden Sie das Apartmentthreadingmodell.

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

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 den Shell-Objekttypnamen (für vordefinierte Shellobjekte).

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 unter dem Schlüssel "Handler Subkey name" einen Unterschlüssel, dessen Name die Zeichenfolgenversion der CLSID der Shell-Erweiterung ist. Mehrere Erweiterungen können unter dem Unterschlüsselschlüsselschlüssel des Handlers registriert werden, indem mehrere Unterschlüssel erstellt werden.

Handler Schnittstelle Handler-Unterschlüsselname
Kontextmenühandler IContextMenu ContextMenuHandlers
Copyhook-Handler ICopyHook CopyHookHandlers
Drag & Drop-Handler IContextMenu DragDropHandlers
Eigenschaftenblatthandler IShellPropSheetExt PropertySheetHandlers
Spaltenanbieterhandler (veraltet in Windows Vista) IColumnProvider ColumnHandlers

 

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

Handler Schnittstelle Handler-Unterschlüsselname
Datenhandler Idataobject Datahandler
Drop-Handler Idroptarget DropHandler
Symbolhandler IExtractIconA/W IconHandler
Bildhandler IExtractImage {BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
Miniaturbildhandler IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
QuickInfo-Handler IQueryInfo {00021500-0000-0000-C000-00000000000046}
Shelllink (ANSI) IShellLinkA {000214EE-0000-0000-C000-00000000000046}
Shelllink (UNICODE) IShellLinkW {000214F9-0000-0000-C000-0000000000046}
Strukturierter Speicher IStorage {0000000B-0000-0000-C000-00000000000046}
Metadaten Ipropertystore PropertyHandler
Metadaten IPropertySetStorage (veraltet in Windows Vista) PropertyHandler
An Startmenü anheften IStartMenuPinnedList {a2a9545d-a0c2-42b4-9708-a0b2badd77c8}
An Taskleiste anheften {90AA3A4E-1CBA-4233-B8BB-535773D4849}

 

Die Unterschlüssel, die angegeben sind, um "An Startmenü anheften " hinzuzufügen, und " An Taskleiste an taskleiste anheften " sind nur für Dateitypen erforderlich, die den IsShortCut-Eintrag enthalten.

Die Unterstützung für Spaltenanbieterhandler wurde in Windows Vista entfernt. Auch seit Windows Vista wurde IPropertySetStorage zugunsten von IPropertyStore veraltet.

Während IExtractImage weiterhin unterstützt wird, wird IThumbnailProvider für Windows Vista und höher bevorzugt.

Vordefinierte Shellobjekte

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

HKEY_CLASSES_ROOT
   *
      shellex
         PropertySheetHandlers

In der folgenden Tabelle werden die verschiedenen Unterschlüssel von HKEY_CLASSES_ROOT angegeben, unter denen Erweiterungshandler registriert werden können. Beachten Sie, dass viele Erweiterungshandler nicht unter allen aufgelisteten Unterschlüsseln registriert werden können. Weitere Details finden Sie in der Dokumentation des spezifischen Handlers.

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

 

Hinweise:

  • Auf das Kontextmenü des Dateiordner-Hintergrunds wird zugegriffen, indem Sie in einem Dateiordner mit der rechten Maustaste klicken, aber nicht über einen der Inhalte des Ordners.
  • "Verbs" sind spezielle Befehle, die unter HKEY_CLASSES_ROOT\SubkeyShellVerb\\ registriert sind.
  • Bei NetworkType\\# ist "#" ein Netzwerkanbietertypcode im Dezimalzeichen. Der Netzwerkanbietertypcode ist das Hochwort 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 Typschlüssel HKEY_CLASSES_ROOT\NetworkType51\\ ist.
  • "network_provider_name" ist ein Netzwerkanbietername, der von WNetGetProviderName angegeben wird, wobei die Leerzeichen in Unterstriche konvertiert werden. Wenn beispielsweise der Microsoft Networking-Netzwerkanbieter installiert ist, lautet der Anbietername "Microsoft Windows Network", und die 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 Erweiterungshandlertypschlüssel mit dem Namen des Handlers. Die Shell verwendet nicht den Namen des Handlers, muss jedoch von allen anderen Namen unter diesem Typunterschlüssel abweichen. Legen Sie den Standardwert des Namensunterschlüssels auf das Zeichenfolgenformular der GUID des Handlers fest.

Im folgenden Beispiel werden Registrierungseinträge veranschaulicht, die Kontextmenü- und Eigenschaftenblatterweiterungshandler aktivieren, indem sie einen Beispieldateityp ".myp" verwenden:

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}

Das in diesem Abschnitt erläuterte Registrierungsverfahren muss für alle Windows Systeme befolgt werden.

Anleitung für die Implementierung von In-Process Erweiterungen