Hinzufügen von Symbolen, Vorschauen und Kontextmenüs

Um sicherzustellen, dass Ihre Daten bei Suchvorgängen ordnungsgemäß indiziert und dem Benutzer angezeigt werden, müssen Sie Shell-Datenspeicher (auch als Shell-Namespaceerweiterungen bezeichnet) und Dateityphandler (auch als Shellerweiterungen, Erweiterungshandler oder Shellerweiterungshandler bezeichnet) implementieren.

In diesem Thema werden die folgenden Schnittstellen beschrieben:

Implementieren von Dateityphandlern

Diese Shellerweiterungen oder Dateityphandler bieten Ihren Benutzern die folgenden Shell-Funktionen:

  • In der Ergebnisansicht wird ein bestimmtes Symbol für Ihren Elementtyp angezeigt.
  • Die Ergebnisansicht zeigt eine Vorschau des Elements an, wenn der Benutzer das Element auswählt.
  • Benutzer können auf Elemente doppelklicken, um Ereignisse wie das Öffnen der Datei zu initiieren.
  • Benutzer können mit der rechten Maustaste auf Elemente klicken, um auf ein Kontextmenü zuzugreifen.
  • Benutzer können Elemente per Drag-and-Drop ablegen.

Wie alle COM-Objekte (Component Object Model) müssen Dateityphandler eine IUnknown-Schnittstelle und eine Klassenfactory implementieren.

In Windows XP oder früher sollten Handler auch Folgendes implementieren:

In Windows Vista wurden die IPersistFile-Schnittstelle und die IShellExtInit-Schnittstelle durch die folgenden drei Schnittstellen für Shell ersetzt, um den Handler zu initialisieren:

Um eine angemessene Benutzerfreundlichkeit zu bieten, müssen Sie einen Shell-Datenspeicher mit Ihrem Protokollhandler bereitstellen. Dieser Datenspeicher dient dann als "Factory" für Symbolhandler, Kontextmenühandler, Vorschauhandler usw. Für IShellFolder Interface sind minimale Implementierungen von IPersist Interface und IPersistFolder Interface erforderlich, und für IContextMenu und IExtractIcon ist eine minimale Implementierung von IShellFolder Interface erforderlich.

Hinweis

Der gleiche Klassenbezeichner (CLSID) sollte für IPersist, IPersistFolder und IShellFolder implementiert werden.

 

Weitere Informationen zum Erstellen eines Shell-Datenspeichers zur Unterstützung eines Protokollhandlers finden Sie unter Implementieren der Grundlegenden Ordnerobjektschnittstellen.

Ipersist

Die IPersist-Schnittstelle definiert die einzelne Methode GetClassID, die für die Bereitstellung der CLSID eines Objekts konzipiert ist, das dauerhaft im System gespeichert werden kann.

Methode BESCHREIBUNG
Getclassid Gibt die CLSID des Shell-Datenspeicherobjekts zurück.

 

IPersistFolder

Die IPersistFolder-Schnittstelle wird verwendet, um Shellordnerobjekte zu initialisieren. Bei der Implementierung dieser Schnittstelle, die von IPersist abgeleitet wird, wird dem Ordner mitgeteilt, wo er sich im Shell-Namespace befindet. Sie verwenden diese Schnittstelle nicht direkt. Es wird von der Dateisystemimplementierung der IShellFolder::BindToObject-Methode verwendet, wenn ein Shell-Ordnerobjekt initialisiert wird.

Methode BESCHREIBUNG
Initialize Weist ein Shell-Ordnerobjekt an, sich basierend auf den übergebenen Informationen zu initialisieren, und gibt S_OK

 

IShellFolder

Die IShellFolder-Schnittstelle wird zum Verwalten von Ordnern verwendet, und eine teilweise Implementierung ist erforderlich, damit sich die für einen Protokollhandler implementierten Symbol- und Kontextschnittstellen in der Windows Search-Ergebnis-Benutzeroberfläche ordnungsgemäß verhalten. Die meisten der erforderlichen Funktionen werden über die GetUIObjectOf-Methode verfügbar gemacht. Mit dieser Methode kann ein Add-In die Schnittstellen IExtractIcon und IContextMenu abfragen.

Die IShellFolder-Schnittstelle verwendet PIDLs anstelle von URLs. Im Gegensatz zu den Anforderungen eines vollständigen Shell-Datenspeichers können Add-Ins eine einfache IDL-Struktur verwenden, die nur die URL enthält.

Die folgenden Methoden der IShellFolder-Schnittstelle müssen implementiert werden. Fünf dieser Methoden erfordern eine minimale Implementierung.

Methode BESCHREIBUNG
BindToObject Gibt E_NOTIMPL zurück
BindToStorage Gibt E_NOTIMPL zurück
CreateViewObject Gibt E_NOTIMPL zurück
SetNameOf Gibt E_NOTIMPL zurück
ParseDisplayName Konvertiert eine URL in die PIDL-Struktur
CompareIDs Vergleicht zwei PIDL-Werte
GetDisplayNameOf Gibt die URL für eine PIDL zurück.
GetUIObjectOf Diese Methode ähnelt der IUnknown::QueryInterface-Methode. Wenn ein Symbol angefordert wird, fordert der Aufrufer die IID_IExtractIcon an. Wenn ein Kontextmenü angefordert wird, fordert der Anrufer die IID_IContextMenu

 

IShellFolder wird nicht zum Auflisten von Ordnern verwendet. Dies bedeutet, dass der Anzeigename eines Ordners die physische URL ist. Dies kann sich in Zukunft ändern.

IContextMenu

Wenn Windows Search dem Benutzer Ergebnisse anzeigt, kann der Benutzer mit der rechten Maustaste auf ein Element klicken und ein Kontextmenü anzeigen, das von Ihrer IContextMenu-Schnittstelle definiert ist. Kontextmenüs werden auch als Kontextmenüs bezeichnet.

Die Standardaktion im Kontextmenü ist dieselbe Aktion, die beim Doppelklicken auf das Element ausgeführt wird. Ohne die entsprechenden IShellFolder - oder IContextMenu-Schnittstellen für das Element besteht das Standardverhalten für ein Doppelklickereignis darin, die URL als Argument an die Funktion ShellExecute Function zu übergeben.

Weitere Informationen zum Erstellen von Kontextmenühandlern finden Sie unter Erstellen von Kontextmenühandlern und Beispiel: Shellerweiterungen für Protokollhandler für Beispielcode.

IExtractIcon

IExtractIcon ruft ein Symbol für die Windows Search-Benutzeroberfläche basierend auf der URL in der PIDL ab, die von Ihrem Protokollhandler bereitgestellt wird.

Weitere Informationen zum Erstellen von Symbolhandlern finden Sie unter Erstellen von Symbolhandlern und Beispiel: Shellerweiterungen für Protokollhandler für Beispielcode.

IPreviewHandler

Der IPreviewHandler rendert eine umfassende Vorschau eines ausgewählten Elements in Windows Explorer. Vorschauversionen sind in Windows Search 4.0 oder in Windows Vista mit Windows Desktop Search 3.x verfügbar.

So erstellen Sie einen benutzerdefinierten Vorschauhandler:

  1. Implementieren Sie einen IPreviewHandler , der einen IStream verwendet, und befolgen Sie die Richtlinien unter Vorschauhandler.

  2. Registrieren Sie Ihren Vorschauhandler:

    HKEY_CLASSES_ROOT\<Your_Object_Type>
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}
       @ = {<Your_PreviewHandler_GUID>}
    
  3. Führen Sie die folgenden beiden Schritte aus, um einen Shellordner für Ihre URL zu implementieren:

    1. Behandeln Sie in IShellFolder::GetUIObjectOf MethodIQueryAssociations , und geben Sie Ihre Zuordnung für Ihre Shellelemente zurück, wie im folgenden Codebeispiel gezeigt.

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. Nachdem die Shell Ihren Shell-Ordner nach dem Datenstrom abgefragt hat, um den Vorschauhandler zu initialisieren, wechseln Sie zu Ihrer IShellFolder::BindToObject-Methode , behandeln IID_IStream und geben einen IStream an Ihre URL zurück.

Führen Sie die folgenden beiden Schritte aus, um einen vorhandenen Vorschauhandler für Ihren Dateityp wiederzuverwenden:

  1. Registrieren Sie diesen Vorschauhandler für Ihren Dateityp mithilfe der CLSID des vorhandenen Vorschauhandlers anstelle von <Your_PreviewHandler_GUID>.
  2. Implementieren Sie einen Shellordner.

Weitere Informationen zum Erstellen von Vorschauhandlern finden Sie unter IPreviewHandler und Vorschauhandler.

Zusätzliche Ressourcen

Konzept

Entwickeln von Protokollhandlern

Grundlegendes zu Protokollhandlern

Benachrichtigen des Indexes der Änderungen

Codebeispiel: Shellerweiterungen für Protokollhandler

Installieren und Registrieren von Protokollhandlern

Erstellen eines Suchconnectors für einen Protokollhandler

Debuggen von Protokollhandlern