Delen via


Preview-handlers en Shell Preview-host

Voorbeeldhandlers worden aangeroepen wanneer een item is geselecteerd om een lichtgewicht, rijke alleen-lezen weer te geven voorbeeld van de inhoud van het bestand in het leesvenster van de weergave. Dit wordt gedaan zonder de bijbehorende toepassing van het bestand te starten.

In dit onderwerp worden de volgende onderwerpen besproken:

Preview-handlerarchitectuur

Een preview-handler is een gehoste toepassing. Tot de hosts behoren onder andere Windows Verkenner in Windows Vista of Microsoft Outlook 2007. Hosts implementeren IPreviewHandlerFrame als communicatiemethode tussen de preview-handler en de host.

De preview-handler zelf implementeert deze interfaces:

Uw handler wordt aangeroepen via de IObjectWithSite, waarmee een IUnknown- aanwijzer wordt geretourneerd waarmee u een IPreviewHandlerFrame object aanvraagt om met de host te communiceren.

Opties voor servermodellen

Previewhandlers draaien altijd buiten het hoofdproces. Er zijn twee methoden om dit te implementeren:

  1. Een preview-handler kan worden gebouwd als een in-process server, maar uitgevoerd via een buiten-proces surrogaathost. Dit is de voorkeursmethode. Het systeem biedt hiervoor een surrogaathost in het Prevhost.exe-bestand. Preview-handlers die door deze methode zijn gebouwd, zijn niet compatibel met Outlook 2007 in Windows XP. Dezelfde handlers werken echter in Windows Verkenner en Outlook 2007 die worden uitgevoerd op Windows Vista.
  2. Een preview-handler kan worden gebouwd als een lokale COM-server (Component Object Model). Dit wordt om verschillende redenen niet aanbevolen. Ten eerste is de implementatie van een in-process server eenvoudiger. Belangrijker is dat de implementatie als een in-process server meer controle biedt over de levensduur van het handler-object, wat een betere opschoon- en efficiëntie mogelijk maakt.

Preview-handlers worden standaard uitgevoerd in een proces met een laag integriteitsniveau (IL) om veiligheidsredenen. U kunt de uitvoering desgewenst uitschakelen als een laag IL-proces door de volgende waarde in het register in te stellen. Het wordt echter niet aanbevolen om dit te doen. Systemen kunnen uiteindelijk worden geconfigureerd voor het weigeren van processen die geen laag IL zijn.

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

Verschillende preview-handlers delen standaard hetzelfde proces. Er kunnen twee exemplaren van Prevhost.exe tegelijk worden uitgevoerd; een voor handlers die worden uitgevoerd als lage IL-processen, één voor handlers die zich hebben afgemeld voor dat gedrag.

Initialisatie

Net als bij miniatuur- en eigenschapshandlers wordt sterk aanbevolen uw handler te initialiseren met een stream. U kunt indien nodig initialiseren via een bestand of item, maar streams bieden de veiligste manier om een handler te implementeren. Initialisatie via een stroom zorgt voor bestandsintegriteit en de stabiliteitsvoordelen voor het systeem van het uitvoeren van de handler als een laag IL-proces, zoals het beveiligen van het systeem tegen bufferoverschrijdingen, het beperken van waar een handler informatie kan schrijven en de communicatie met andere vensters kan beperken.

Als u een bestand of Shell-item moet initialiseren, slaat u het bestandspad of een verwijzing op naar de IShellItem-. Lees geen gegevens uit deze bronnen totdat IPreviewHandler::DoPreview wordt aangeroepen.

Over het algemeen mag initialisatie geen zware werkzaamheden uitvoeren, zoals het opstellen en opslaan van een voorbeeldafbeelding. Voor een optimale efficiëntie moet dat soort verwerking pas worden uitgevoerd als de preview-versie wordt aangeroepen.

Voorbeeld van handlergegevensstroom

De gegevensstroom in het preview-proces volgt het algemene pad dat hier wordt weergegeven. De host kan worden beschouwd als Windows Verkenner in Windows Vista of Outlook 2007.

  1. De preview-handler wordt geïnitialiseerd, bij voorkeur met een stream.
  2. Het weergavevenster wordt vanaf de host doorgegeven aan de handler via IPreviewHandler::SetWindow.
  3. Op dit moment moet de handler niets meer doen totdat IPreviewHandler::DoPreview wordt aangeroepen.
  4. Het voorbeeld wordt in het leesvenster weergegeven via een aanroep naar IPreviewHandler::DoPreview.
  5. De grootte van het venster wordt ingesteld via IPreviewHandler::SetRect.
  6. Indien nodig wordt het venster opnieuw ingesteld met behulp van IPreviewHandler::SetRect.
  7. De preview wordt verwijderd en de bijbehorende resources worden vrijgegeven wanneer deze niet meer nodig zijn, via een aanroep naar IPreviewHandler::Unload.

Fouten opsporen in een preview-handler

Als u de aanbevelingen voor het implementeren van uw preview-handler als een in-process-server hebt gevolgd om fouten op te sporen in uw preview-handler, kunt u deze koppelen aan Prevhost.exe. Zoals eerder vermeld, moet u er rekening mee houden dat er twee exemplaren van Prevhost.exekunnen zijn, één voor standaard low IL-processen en één voor die handlers die zich hebben afgemeld voor uitvoering als een low IL-proces.

Als u Prevhost.exe niet in uw lijst met beschikbare processen vindt, is deze waarschijnlijk niet geladen op dat moment. Als u op een bestand voor een voorbeeld klikt, wordt de surrogaat geladen. Het moet vervolgens worden weergegeven als een bijvoegbaar proces.

Uw eigen proces instellen voor een preview-handler

Als u het maken van een nieuw proces voor uw handler wilt afdwingen in plaats van onder het standaardproces uit te voeren, maakt u een nieuwe subsleutel voor uw handler onder AppID- en stelt u de vermelding DllSurrogate in op 'Prevhost.exe'. Gebruik deze AppID subsleutel in plaats van de standaard-Prevhost.exe AppID-.

Door een nieuw proces op te geven, kan de handler voorkomen dat deze wordt uitgevoerd onder een gedeeld proces, zoals dit standaard zou gebeuren. Hierdoor kunt u bijvoorbeeld ervoor zorgen dat de specifieke versie van de Common Language Runtime (CLR) in het proces wordt uitgevoerd. Dit is vereist als u een beheerde implementatie van een preview-handler bouwt.

Notitie

32-bits preview-handlers moeten gebruikmaken van AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C} wanneer ze zijn geïnstalleerd op 64-bits besturingssystemen.

 

Preview-handlers bouwen

Een preview-handler registreren

Preview Handler Richtlijnen