Erstellen von Shellerweiterungshandlern

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

Ein leistungsfähigerer und flexiblerer Ansatz zum Erweitern der Shell ist die Implementierung von Shellerweiterungshandlern. 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 und gibt ihr die Möglichkeit, die Aktion zu ändern. Ein gängiges Beispiel ist ein Kontextmenüerweiterungshandler. Wenn eine für einen Dateityp implementiert ist, wird sie jedes Mal abgefragt, wenn mit der rechten Maustaste auf eine der Dateien geklickt wird. Der Handler kann dann zusätzliche Menüelemente auf Datei-für-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, dateiweise anzugeben:

Handler BESCHREIBUNG
Kontextmenühandler Wird aufgerufen, bevor das Kontextmenü einer Datei angezeigt wird. Damit können Sie dem Kontextmenü Datei für Datei Elemente hinzufügen.
Datenhandler Wird aufgerufen, wenn ein Drag-and-Drop-Vorgang für dragShell-Objekte ausgeführt wird. Dadurch können Sie dem Ablageziel zusätzliche Zwischenablageformate bereitstellen.
Drop-Handler Wird aufgerufen, wenn ein Datenobjekt über eine Datei gezogen oder gelöscht wird. Es ermöglicht Ihnen, eine Datei zu einem Ablageziel zu machen.
Symbolhandler Wird aufgerufen, bevor das Symbol einer Datei angezeigt wird. Dadurch können Sie das Standardsymbol der Datei auf Dateibasis durch ein benutzerdefiniertes Symbol ersetzen.
Eigenschaftenblatthandler Wird aufgerufen, bevor das Eigenschaftenblatt Eigenschaften eines Objekts angezeigt wird. Es ermöglicht Ihnen, Seiten hinzuzufügen oder zu ersetzen.
Miniaturbildhandler Stellt ein Bild bereit, das das Element darstellt.
QuickInfo-Handler Stellt Popuptext bereit, wenn der Benutzer mit dem Mauszeiger auf das Objekt zeigt.
Metadatenhandler Bietet Lese- und Schreibzugriff auf Metadaten (Eigenschaften), die in einer Datei gespeichert sind. Dies kann verwendet werden, um die Detailsansicht, Infotips, die Eigenschaftenseite und die Gruppierungsfeatures zu erweitern.

 

Andere Handler sind keinem bestimmten Dateityp zugeordnet, sondern werden vor einigen Shellvorgä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.
Kopierhakenhandler Wird aufgerufen, wenn ein Ordner- oder Druckerobjekt verschoben, kopiert, gelöscht oder umbenannt werden soll. Es ermöglicht Ihnen, den Vorgang zu genehmigen oder ein Veto einzufügen.
Drag & Drop-Handler Wird aufgerufen, wenn eine Datei mit der rechten Maustaste gezogen wird. Dadurch können Sie 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 Aufgerufen, um eine Suchmaschine zu starten. Es ermöglicht Ihnen, eine benutzerdefinierte Suchmaschine zu 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 Shellerweiterungshandlern

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

Viele Shell-Erweiterungshandler sind prozessinterne COM-Objekte (Component Object Model). Sie müssen eine GUID zugewiesen und registriert werden, wie unter Registrieren von Shellerweiterungshandlern beschrieben. Sie werden als DLLs implementiert und müssen die folgenden Standardfunktionen exportieren:

  • DllMain. Der Standardeinstiegspunkt zur DLL.
  • DllGetClassObject. Macht die Klassenfactory des Objekts verfügbar.
  • DllCanUnloadNow. COM ruft diese Funktion auf, um zu bestimmen, ob das Objekt Clients bedient. Andernfalls kann das System die DLL entladen und den zugeordneten Arbeitsspeicher freigeben.

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

Die IPersistFile-Schnittstelle muss wie folgt implementiert werden:

  • Datenhandler
  • Löschen von Handlern

In der Vergangenheit waren auch Symbolhandler erforderlich, um IPersistFile zu implementieren, aber dies ist nicht mehr wahr. 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 das Laden oder Speichern eines Objekts aus einer Datenträgerdatei ermöglichen. Es verfügt über sechs Methoden neben IUnknown, fünf eigene und die GetClassID-Methode , die sie von IPersist erbt. Bei Shell-Erweiterungen wird IPersist nur verwendet, um ein Shell-Erweiterungshandlerobjekt zu initialisieren. Da in der Regel keine Lese- oder Schreibvorgänge auf dem Datenträger erforderlich sind, erfordern nur die Methoden GetClassID und Load eine Implementierung ohne Token.

Die Shell ruft zuerst GetClassID auf, und die Funktion gibt den Klassenbezeichner (CLSID) des Erweiterungshandlerobjekts zurück. Die Shell ruft dann Load auf und übergibt zwei Werte. Die erste, pszFileName, ist eine Unicode-Zeichenfolge mit dem Namen der Datei oder des Ordners, für die die Shell gerade arbeitet. Der zweite ist dwMode, der 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 Methoden GetClassID und Load implementiert. Es ist für die Verarbeitung von ANSI oder Unicode konzipiert. 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 zum Speichern des Dateinamens und der Zugriffsflags verwendet werden.

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 zusätzlich zu IUnknown nur über eine Methode, IShellExtInit::Initialize. Die -Methode verfügt über drei Parameter, die die Shell verwenden kann, um verschiedene Arten von Informationen zu übergeben. 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 dies NULL. Bei Kontextmenüerweiterungen ist es die PIDL des Ordners, der das Element enthält, dessen Kontextmenü angezeigt wird. Bei nicht standardmäßigen Drag-and-Drop-Handlern ist dies die PIDL des Zielordners.
  • pDataObject enthält einen Zeiger auf die IDataObject-Schnittstelle eines Datenobjekts. Das Datenobjekt enthält einen oder mehrere Dateinamen in 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 für die spätere Verwendung. Das folgende Codefragment veranschaulicht eine Implementierung von IShellExtInit::Initialize. Der Einfachheit halber 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 übergebenen Informationen verwendet werden. Der Einfachheit halber wird in diesem Beispiel davon ausgegangen, dass das Datenobjekt nur einen Dateinamen enthält. Nachdem die FORMATTC-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 weist das Handle m_hRegKey zu.

Infotip-Anpassung

Es gibt zwei Möglichkeiten, Infotips anzupassen:

  • 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 Shellerweiterungshandlern unten).
  • Geben Sie eine feste Zeichenfolge oder eine Liste mit bestimmten Dateieigenschaften an, die angezeigt werden sollen.

Um eine feste Zeichenfolge für eine Namespaceerweiterung anzuzeigen, erstellen Sie einen Eintrag namens InfoTip im {CLSID}- Schlüssel Ihrer Namespaceerweiterung. Legen Sie den Wert dieses Eintrags auf die Literalzeichenfolge fest, die Sie anzeigen möchten, wie in diesem Beispiel gezeigt, oder auf eine indirekte Zeichenfolge, die eine Ressource und einen Index innerhalb dieser Ressource angibt (zu Lokalisierungszwecken).

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 namens InfoTip im ProgID-Schlüssel dieses Dateityps. Legen Sie den Wert dieses Eintrags auf die literale Zeichenfolge fest, die Sie anzeigen möchten, oder eine indirekte Zeichenfolge, die eine Ressource und einen Index innerhalb dieser Ressource (zu Lokalisierungszwecken) angibt, wie in diesem Beispiel gezeigt.

HKEY_CLASSES_ROOT
   ProgID
      InfoTip = Resource.dll, 3

Wenn die Shell bestimmte Dateieigenschaften im Infotip für einen bestimmten Dateityp anzeigen soll, erstellen Sie einen Eintrag InfoTip namens im ProgID-Schlüssel für diesen Dateityp. Legen Sie den Wert dieses Eintrags auf eine semikolontrennte Liste von kanonischen Eigenschaftennamen, FMTID-/Eigenschaftsbezeichner-Paaren (PID) oder beidem fest. Dieser Wert muss mit "prop:" beginnen, um ihn als Eigenschaftenlistenzeichenfolge zu identifizieren. Wenn Sie "prop:" weglassen, wird der Wert als Literalzeichenfolge betrachtet und als solche angezeigt.

Im folgenden Beispiel ist propname ein kanonischer Eigenschaftenname (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 Zusammenfassung des Themas PIDSI_SUBJECT
Kommentar Dokumentkommentare PIDSI_COMMENT - oder Ordner-/Treibereigenschaften
PageCount Anzahl von Seiten PIDSI_PAGECOUNT
Name Angezeigter Name Standardordneransicht
OriginalLocation Speicherort der Ursprünglichen Datei Aktenkofferordner und Papierkorbordner
DateDeleted Datum des Löschens der Datei Ordner "Papierkorb"
type Dateityp Standardansicht für Ordnerdetails
Size Größe der Datei Standardansicht für Ordnerdetails
SyncCopyIn Identisch mit OriginalLocation Identisch mit OriginalLocation
Geändert Datum der letzten Änderung Standardansicht für Ordnerdetails
Erstellt Erstellungsdatum Standardansicht für Ordnerdetails
Zugegriffen Datum des letzten Zugriffs Standardansicht für Ordnerdetails
InFolder Verzeichnis mit der Datei Dokumentsuchergebnisse
Rang Qualität der Suchabfrage Dokumentsuchergebnisse
FreeSpace Verfügbarer Speicherplatz Laufwerke
NumberOfVisits Anzahl von Aufrufen Ordner "Favoriten"
Attribute Dateiattribute Standardansicht für Ordnerdetails
Company Unternehmensname PIDDSI_COMPANY
Category Dokumentkategorie PIDDSI_CATEGORY
Copyright Medienrecht PIDMSI_COPYRIGHT
HTMLInfoTipFile HTML InfoTip-Datei Desktop.ini Datei für Ordner

 

Verbessern der Windows-Suche mit Shellerweiterungshandlern

Shellerweiterungshandler können verwendet werden, um die Benutzerfreundlichkeit eines Windows Search-Protokollhandlers zu verbessern. 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 Search-Protokollhandlers durch Integration in einen Shell-Erweiterungshandler finden Sie unter Hinzufügen von Symbolen, Vorschauen und Kontextmenüs. Weitere Informationen zu Windows Search-Protokollhandlern finden Sie unter Entwickeln von Protokollhandlern.

Registrieren von Shellerweiterungshandlern

Ein Shellerweiterungshandlerobjekt muss registriert werden, bevor es von der Shell verwendet werden kann. In diesem Abschnitt erfahren Sie, wie Sie einen Shellerweiterungshandler registrieren.

Jedes Mal, wenn Sie einen Shellerweiterungshandler erstellen oder ändern, ist es wichtig, das System darüber zu benachrichtigen, dass Sie eine Änderung mit SHChangeNotify vorgenommen haben, wobei das SHCNE_ASSOCCHANGED-Ereignis angegeben wird. 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 mithilfe eines Tools wie UUIDGEN.exe eine GUID für den Handler erstellen. Erstellen Sie einen Schlüssel unter HKEY_CLASSES_ROOT\CLSID , dessen Name die Zeichenfolgenform der GUID ist. Da Es sich bei Shell-Erweiterungshandlern um Prozessserver handelt, müssen Sie einen InProcServer32-Schlüssel unter dem GUID-Schlüssel erstellen, dessen Standardwert auf den Pfad der DLL des Handlers festgelegt ist. Verwenden Sie das Apartmentthreadingmodell.

Jedes Mal, wenn die Shell eine Aktion ausführt, die einen Shellerweiterungshandler umfassen kann, überprüft sie den entsprechenden Registrierungsschlüssel. Der Schlüssel, unter dem ein Erweiterungshandler registriert wird, steuert somit, wann 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-Schlüssel des Dateityps registriert werden.

Handlernamen

Um einen Shellerweiterungshandler zu aktivieren, erstellen Sie einen Unterschlüssel mit dem Handlerunterschlüsselnamen (siehe unten) unter dem ShellEx-Unterschlüssel der ProgID (für Dateitypen) oder des Shell-Objekttypnamens (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 einen Unterschlüssel unter dem Schlüssel "Handler-Unterschlüsselname", dessen Name die Zeichenfolgenversion der CLSID der Shell-Erweiterung ist. Mehrere Erweiterungen können unter dem Schlüssel des Handlerunterschlüssels registriert werden, indem mehrere Unterschlüssel erstellt werden.

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

 

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

Handler Schnittstelle Name des Handlerunterschlüssels
Datenhandler Idataobject Datahandler
Löschen des Handlers Idroptarget DropHandler
Symbolhandler IExtractIconA/W IconHandler
Imagehandler IExtractImage {BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
Miniaturbildhandler IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
QuickInfo-Handler IQueryInfo {00021500-0000-0000-C000-000000000046}
Shelllink (ANSI ) IShellLinkA {000214EE-0000-0000-C000-000000000046}
Shelllink (UNICODE) IShellLinkW {000214F9-0000-0000-C000-000000000046}
Strukturierter Speicher IStorage {0000000B-0000-0000-C000-000000000046}
Metadaten Ipropertystore PropertyHandler
Metadaten IPropertySetStorage (in Windows Vista veraltet) PropertyHandler
An 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.

Die Unterstützung für Spaltenanbieterhandler wurde in Windows Vista entfernt. Außerdem ist IPropertySetStorage seit Windows Vista 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. Um beispielsweise einen Eigenschaftenblatthandler für alle Dateien hinzuzufügen, können Sie sich unter dem Schlü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 Version
* Alle Dateien Kontextmenü, Eigenschaftenblatt, Verben (siehe unten) Alle
AllFileSystemObjects Alle Dateien und Dateiordner Kontextmenü, Eigenschaftenblatt, Verben 4.71
Ordner Alle Ordner Kontextmenü, Eigenschaftenblatt, Verben Alle
Verzeichnis Dateiordner Kontextmenü, Eigenschaftenblatt, Verben Alle
Verzeichnis\Hintergrund Hintergrund des Dateiordners Nur Kontextmenü 4.71
Laufwerk Alle Laufwerke in MyComputer, z. B. "C:\" Kontextmenü, Eigenschaftenblatt, Verben Alle
Network Gesamtes Netzwerk (unter Meine Netzwerkplätze) Kontextmenü, Eigenschaftenblatt, Verben Alle
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 Alle
Drucker Alle Drucker Kontextmenü, Eigenschaftenblatt Alle
Audiocd Audio-CD im CD-Laufwerk Nur Verben Alle
DVD DVD-Laufwerk (Windows 2000) Kontextmenü, Eigenschaftenblatt, Verben 4.71

 

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 Typschlü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 Erweiterungshandlertypschlüssel 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üs- und Eigenschaftenblatterweiterungshandler mit einem Beispiel 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}

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

Leitfaden zum Implementieren von In-Process-Erweiterungen