Vorschauhandler und Shellvorschauhost

Vorschauhandler werden aufgerufen, wenn ein Element ausgewählt wird, um eine einfache, umfassende und schreibgeschützte Vorschau des Dateiinhalts im Lesebereich der Ansicht anzuzeigen. Dies erfolgt, ohne die der Datei zugeordnete Anwendung zu starten.

In diesem Thema werden die folgenden Themen behandelt:

Vorschauhandlerarchitektur

Ein Vorschauhandler ist eine gehostete Anwendung. Hosts enthalten die Windows-Explorer in Windows Vista oder Microsoft Outlook 2007. Hosts implementieren IPreviewHandlerFrame als Kommunikationsmethode zwischen dem Vorschauhandler und dem Host.

Der Vorschauhandler selbst implementiert diese Schnittstellen:

Ihr Handler wird über seine IObjectWithSite aufgerufen, die einen IUnknown-Zeiger zurückgibt, über den Sie ein IPreviewHandlerFrame-Objekt für die Interaktion mit dem Host anfordern.

Servermodelloptionen

Vorschauhandler sind immer nicht mehr verfügbar. Es gibt zwei Methoden für die Implementierung:

  1. Ein Vorschauhandler kann als Prozessinterner Server erstellt werden, aber über einen Out-of-Process-Ersatzhost ausgeführt werden. Dies ist die bevorzugte Methode. Das System stellt einen Ersatzhost dafür in der Prevhost.exe-Datei bereit. Mit dieser Methode erstellte Vorschauhandler sind nicht mit Outlook 2007 unter Windows XP kompatibel. Diese Handler funktionieren jedoch in Windows Explorer und Outlook 2007 unter Windows Vista.
  2. Ein Vorschauhandler kann als lokaler COM-Server (Component Object Model) erstellt werden. Dies wird aus verschiedenen Gründen nicht empfohlen. Erstens ist die Implementierung eines prozessinternen Servers einfacher. Noch wichtiger ist, dass die Implementierung als Prozessserver eine bessere Kontrolle über die Lebensdauer des Handlerobjekts bietet, was eine bessere Bereinigung und Effizienz ermöglicht.

Standardmäßig werden Vorschauhandler aus Sicherheitsgründen in einem Prozess mit niedriger Integritätsstufe (IL) ausgeführt. Sie können optional die Ausführung als Prozess mit niedriger IL deaktivieren, indem Sie den folgenden Wert in der Registrierung festlegen. Es wird jedoch nicht empfohlen, dies zu tun. Systeme können schließlich so konfiguriert werden, dass sie jeden Prozess ablehnen, der keine niedrige IL hat.

HKEY_CLASSES_ROOT
   CLSID
      {YOUR HANDLER'S CLSID}
         DisableLowILProcessIsolation [DWORD] = 1

Verschiedene Vorschauhandler verwenden standardmäßig denselben Prozess. Zwei Instanzen von Prevhost.exe können gleichzeitig ausgeführt werden. eine für Handler, die als Prozesse mit niedriger IL ausgeführt werden, einer für Handler, die dieses Verhalten deaktiviert haben.

Initialisierung

Wie bei Miniaturansichts- und Eigenschaftshandlern wird dringend empfohlen, den Handler mit einem Stream zu initialisieren. Sie können bei Bedarf über eine Datei oder ein Element initialisieren, aber Streams bieten die sicherste Möglichkeit zum Implementieren eines Handlers. Die Initialisierung über einen Stream stellt die Dateiintegrität und die Stabilitätsvorteile für das System sicher, wenn der Handler als prozessarm ausgeführt wird, z. B. schutz des Systems vor Pufferüberläufen, Einschränken des Schreiborts eines Handlers für Informationen und Einschränken der Kommunikation mit anderen Fenstern.

Wenn Sie mit einer Datei oder einem Shellelement initialisieren müssen, speichern Sie den Dateipfad oder einen Verweis auf das IShellItem. Lesen Sie erst Daten aus diesen Quellen , wenn IPreviewHandler::D oPreview aufgerufen wird.

Im Allgemeinen sollte die Initialisierung keine umfangreichen Aufgaben wie das Komponieren und Speichern eines Vorschaubilds durchführen. Für eine optimale Effizienz sollte diese Art der Verarbeitung erst ausgeführt werden, wenn die Vorschau aufgerufen wird.

Vorschauhandler-Datenfluss

Der Datenfluss im Vorschauprozess folgt dem hier gezeigten allgemeinen Pfad. Der Host kann als Windows Explorer in Windows Vista oder Outlook 2007 betrachtet werden.

  1. Der Vorschauhandler wird initialisiert, vorzugsweise mit einem Stream.
  2. Das Ansichtsfenster wird vom Host über IPreviewHandler::SetWindow an den Handler übergeben.
  3. An diesem Punkt sollte der Handler nichts mehr tun, bis IPreviewHandler::D oPreview aufgerufen wird.
  4. Die Vorschau wird im Lesebereich durch einen Aufruf von IPreviewHandler::D oPreview angezeigt.
  5. Die Größe des Fensters wird über IPreviewHandler::SetRect festgelegt.
  6. Die Größe des Fensters wird bei Bedarf über IPreviewHandler::SetRect geändert.
  7. Die Vorschau wird entladen und ihre Ressourcen freigegeben, wenn sie nicht mehr benötigt wird, durch einen Aufruf von IPreviewHandler::Unload.

Debuggen eines Vorschauhandlers

Wenn Sie die Empfehlungen zum Implementieren Ihres Vorschauhandlers als prozessinternen Server befolgt haben, können Sie zum Debuggen Des Vorschauhandlers an Prevhost.exe anfügen. Wie bereits erwähnt, beachten Sie, dass es zwei Instanzen von Prevhost.exe geben kann: eine für normale Prozesse mit niedriger IL und eine für die Handler, die die Ausführung als Prozess mit niedriger IL deaktiviert haben.

Wenn Sie Prevhost.exe in Ihrer Liste der verfügbaren Prozesse nicht finden, wurde es wahrscheinlich zu diesem Zeitpunkt nicht geladen. Wenn Sie auf eine Datei für eine Vorschau klicken, wird das Ersatzzeichen geladen, und es sollte dann als anzufügender Prozess angezeigt werden.

Bereitstellen eines eigenen Prozesses für einen Vorschauhandler

Wenn Sie die Erstellung eines neuen Prozesses für Ihren Handler erzwingen möchten, anstatt unter dem Standardprozess auszuführen, erstellen Sie unter AppID einen neuen Unterschlüssel für den Handler, und legen Sie den DllSurrogate-Eintrag auf "Prevhost.exe" fest. Verwenden Sie diesen AppID-Unterschlüssel anstelle des Standard-Prevhost.exe AppID.

Durch die Bereitstellung eines neuen Prozesses kann der Handler die Ausführung unter einem freigegebenen Prozess vermeiden, wie dies standardmäßig der Vorgang wäre. Dadurch können Sie beispielsweise die spezifische Version der Common Language Runtime (CLR) im Prozess sicherstellen. Dies ist erforderlich, wenn Sie eine verwaltete Implementierung eines Vorschauhandlers erstellen.

Hinweis

32-Bit-Vorschauhandler sollten appID {534A1E02-D58F-44f0-B58B-36CBED287C7C} verwenden, wenn sie auf 64-Bit-Betriebssystemen installiert sind.

 

Erstellen von Vorschauhandlern

Registrieren eines Vorschauhandlers

Richtlinien für Vorschauhandler