Condividi tramite


Gestori di anteprima e host di anteprima della shell

I gestori di anteprima vengono chiamati quando un elemento è selezionato per visualizzare un'anteprima leggera, avanzata e di sola lettura del contenuto del file nel riquadro di lettura della visualizzazione. Questa operazione viene eseguita senza avviare l'applicazione associata al file.

Questo argomento illustra gli argomenti seguenti:

Architettura del gestore di anteprima

Un gestore di anteprima è un'applicazione ospitata. Gli host includono Esplora risorse in Windows Vista o Microsoft Outlook 2007. Gli host implementano IPreviewHandlerFrame come metodo di comunicazione tra il gestore di anteprima e l'host.

Il gestore di anteprima implementa queste interfacce:

Il gestore viene chiamato tramite IObjectWithSite, che restituisce un puntatore IUnknown tramite il quale si richiede un oggetto IPreviewHandlerFrame per interagire con l'host.

Opzioni del modello server

I gestori di anteprima eseguono sempre fuori processo. Esistono due metodi di implementazione:

  1. Un gestore di anteprima può essere compilato come server in-process, ma viene eseguito tramite un host surrogato out-of-process. Questo è il metodo preferito. Il sistema fornisce un host surrogato per questo nel file di Prevhost.exe. I gestori di anteprima compilati da questo metodo non sono compatibili con Outlook 2007 in Windows XP. Tuttavia, questi stessi gestori funzioneranno in Esplora risorse e Outlook 2007 in esecuzione in Windows Vista.
  2. Un gestore di anteprima può essere compilato come server COM (Component Object Model) locale. Questo non è consigliato per diversi motivi. Prima di tutto, l'implementazione di un server in-process è più semplice. Più importante, l'implementazione come server in-process offre un maggiore controllo sulla durata dell'oggetto gestore, che consente una migliore pulizia ed efficienza.

Per impostazione predefinita, i gestori di anteprima vengono eseguiti in un processo a basso livello di integrità (IL) per motivi di sicurezza. Facoltativamente, è possibile disabilitare l'esecuzione come processo IL basso impostando il valore seguente nel Registro di sistema. Tuttavia, non è consigliabile farlo. I sistemi possono infine essere configurati per rifiutare qualsiasi processo che non è basso.

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

I gestori di anteprima diversi condividono lo stesso processo per impostazione predefinita. Due istanze di Prevhost.exe possono essere eseguite contemporaneamente; uno per i gestori che eseguono come processi DI IL basso, uno per i gestori che hanno consenso esplicito su tale comportamento.

Inizializzazione

Come per i gestori di anteprime e proprietà, è consigliabile inizializzare il gestore con un flusso. È possibile inizializzare tramite un file o un elemento, se necessario, ma i flussi offrono il modo più sicuro per implementare un gestore. L'inizializzazione tramite un flusso garantisce l'integrità dei file e i vantaggi di stabilità per il sistema di esecuzione del gestore come processo di il bilanciamento del carico interno, ad esempio la protezione del sistema da overrun del buffer, la limitazione della scrittura di informazioni da parte di un gestore e la limitazione delle comunicazioni con altre finestre.

Se è necessario inizializzare con un file o un elemento shell, archiviare il percorso del file o un riferimento a IShellItem. Non leggere i dati da queste origini finché non viene chiamato IPreviewHandler::D oPreview .

In generale, l'inizializzazione non deve eseguire operazioni pesanti, ad esempio la composizione e l'archiviazione di un'immagine di anteprima. Per un'efficienza ottimale, tale tipo di elaborazione non deve essere eseguita finché non viene chiamata l'anteprima.

Flusso di dati gestore di anteprima

Il flusso di dati nel processo di anteprima segue il percorso generale illustrato qui. L'host può essere considerato come Esplora windows in Windows Vista o Outlook 2007.

  1. Il gestore di anteprima viene inizializzato, preferibilmente con un flusso.
  2. La finestra di visualizzazione viene passata dall'host al gestore tramite IPreviewHandler::SetWindow.
  3. A questo punto, il gestore non deve più eseguire altre operazioni finché non viene chiamato IPreviewHandler::D oPreview .
  4. L'anteprima viene visualizzata nel riquadro di lettura tramite una chiamata a IPreviewHandler::D oPreview.
  5. Le dimensioni della finestra sono impostate tramite IPreviewHandler::SetRect.
  6. La finestra viene ridimensionata quando necessario tramite IPreviewHandler::SetRect.
  7. L'anteprima viene scaricata e le relative risorse rilasciate quando non è più necessario, tramite una chiamata a IPreviewHandler::Unload.

Debug di un gestore di anteprima

Se sono stati seguiti i consigli per implementare il gestore di anteprima come server in-process, per eseguire il debug del gestore di anteprima, è possibile collegarsi a Prevhost.exe. Come accennato in precedenza, tenere presente che potrebbero essere presenti due istanze di Prevhost.exe, una per i normali processi ilRE bassi e una per i gestori che hanno scelto di eseguire come un processo di IL basso.

Se non si trova Prevhost.exe nell'elenco dei processi disponibili, probabilmente non è stato caricato a quel punto. Facendo clic su un file per un'anteprima viene caricato il surrogato e verrà quindi visualizzato come processo collegato.

Fornire un processo personalizzato per un gestore di anteprima

Se si vuole forzare la creazione di un nuovo processo per il gestore anziché eseguire nel processo predefinito, creare una nuova sottochiave per il gestore in AppID e impostare la voce DllSurrogate su "Prevhost.exe". Usare la sottochiave AppID anziché il valore predefinito Prevhost.exe AppID.

Fornendo un nuovo processo, il gestore può evitare l'esecuzione in un processo condiviso in quanto eseguirebbe per impostazione predefinita. Ciò potrebbe consentire, ad esempio, di garantire la versione specifica di Common Language Runtime (CLR) nel processo. Questa operazione è necessaria se si sta creando un'implementazione gestita di un gestore di anteprima.

Nota

I gestori di anteprima a 32 bit devono usare AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C} quando installato nei sistemi operativi a 64 bit.

 

Creazione di gestori di anteprima

Come registrare un gestore di anteprima

Linee guida per il gestore di anteprima