Compartir a través de


Controladores de vista previa y host de vista previa de Shell

Se llama a los controladores de vista previa cuando se selecciona un elemento para mostrar una vista previa ligera, enriquecida y de solo lectura del contenido del archivo en el panel de lectura de la vista. Esto se hace sin iniciar la aplicación asociada del archivo.

En este tema se describen los temas siguientes:

Arquitectura del controlador de vista previa

Un controlador de vista previa es una aplicación hospedada. Los hosts incluyen el Explorador de Windows en Windows Vista o Microsoft Outlook 2007. Los hosts implementan IPreviewHandlerFrame como método de comunicación entre el controlador de vista previa y el host.

El propio controlador de vista previa implementa estas interfaces:

Se llama al controlador a través de su IObjectWithSite, que devuelve un puntero IUnknown a través del cual se solicita un objeto IPreviewHandlerFrame para interactuar con el host.

Opciones del modelo de servidor

Los controladores de vista previa siempre se ejecutan fuera de proceso. Hay dos métodos para implementar esto:

  1. Un controlador de vista previa se puede compilar como un servidor en proceso, pero se ejecuta a través de un host suplente fuera de proceso. Este es el método preferido. El sistema proporciona un host suplente para esto en el archivo Prevhost.exe. Los controladores de vista previa creados por este método no son compatibles con Outlook 2007 en Windows XP. Sin embargo, estos mismos controladores funcionarán en el Explorador de Windows y Outlook 2007 que se ejecuta en Windows Vista.
  2. Un controlador de vista previa se puede compilar como un servidor local del Modelo de objetos componentes (COM). Esto no se recomienda por varias razones. En primer lugar, la implementación de un servidor en proceso es más fácil. Lo que es más importante, la implementación como servidor en proceso proporciona un mayor control sobre la duración del objeto de controlador, lo que permite una mejor limpieza y eficiencia.

De forma predeterminada, los controladores de vista previa se ejecutan en un proceso de nivel de integridad bajo (IL) por motivos de seguridad. Opcionalmente, puede deshabilitar la ejecución como un proceso de IL bajo estableciendo el siguiente valor en el Registro. Sin embargo, no se recomienda hacerlo. Los sistemas podrían configurarse finalmente para rechazar cualquier proceso que no sea il bajo.

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

De forma predeterminada, los diferentes controladores de vista previa comparten el mismo proceso. Dos instancias de Prevhost.exe se pueden ejecutar simultáneamente; uno para los controladores que se ejecutan como procesos de IL bajos, uno para los controladores que han optado por no participar en ese comportamiento.

Inicialización

Al igual que con los controladores de propiedades y miniaturas, se recomienda encarecidamente inicializar el controlador con una secuencia. Puede inicializar a través de un archivo o elemento si es necesario, pero las secuencias proporcionan la manera más segura de implementar un controlador. La inicialización a través de una secuencia garantiza la integridad de los archivos y las ventajas de estabilidad en el sistema de ejecución del controlador como un proceso de IL bajo, como proteger el sistema frente a saturaciones del búfer, limitar dónde un controlador puede escribir información y limitar la comunicación con otras ventanas.

Si debe inicializar con un archivo o un elemento de Shell, almacene la ruta de acceso del archivo o una referencia al objeto IShellItem. No lea datos de estos orígenes hasta que se llame a IPreviewHandler::D oPreview .

En general, la inicialización no debe realizar ningún trabajo pesado, como la redacción y el almacenamiento de una imagen de vista previa. Para lograr una eficacia óptima, ese tipo de procesamiento no se debe realizar hasta que se llame a la versión preliminar.

Data Flow de controlador de vista previa

El flujo de datos del proceso de versión preliminar sigue la ruta de acceso general que se muestra aquí. El host se puede considerar explorador de Windows en Windows Vista o Outlook 2007.

  1. El controlador de vista previa se inicializa, preferiblemente con una secuencia.
  2. La ventana de vista se pasa desde el host al controlador a través de IPreviewHandler::SetWindow.
  3. En este punto, el controlador no debe hacer nada más hasta que se llame a IPreviewHandler::D oPreview .
  4. La vista previa se muestra en el panel de lectura a través de una llamada a IPreviewHandler::D oPreview.
  5. El tamaño de la ventana se establece mediante IPreviewHandler::SetRect.
  6. La ventana se cambia de tamaño cuando es necesario a través de IPreviewHandler::SetRect.
  7. La versión preliminar se descarga y sus recursos se liberan cuando ya no se necesitan, a través de una llamada a IPreviewHandler::Unload.

Depuración de un controlador de vista previa

Si ha seguido las recomendaciones para implementar el controlador de vista previa como servidor en proceso, para depurar el controlador de vista previa, puede asociarlo a Prevhost.exe. Como se mencionó anteriormente, tenga en cuenta que podría haber dos instancias de Prevhost.exe, una para procesos normales de IL bajos y otra para los controladores que han optado por no ejecutarse como un proceso de IL bajo.

Si no encuentra Prevhost.exe en la lista de procesos disponibles, probablemente no se haya cargado en ese momento. Al hacer clic en un archivo para obtener una vista previa, se carga el suplente y, a continuación, debería aparecer como un proceso adjuntable.

Proporcionar su propio proceso para un controlador de versión preliminar

Si desea forzar la creación de un nuevo proceso para el controlador en lugar de ejecutarse en el proceso predeterminado, cree una nueva subclave para el controlador en AppID y establezca su entrada DllSurrogate en "Prevhost.exe". Use esa subclave AppID en lugar del valor predeterminado Prevhost.exe AppID.

Al proporcionar un nuevo proceso, el controlador puede evitar ejecutarse en un proceso compartido como lo haría de forma predeterminada. Esto podría permitirle, por ejemplo, garantizar la versión específica de Common Language Runtime (CLR) en el proceso. Esto es necesario si va a crear una implementación administrada de un controlador de versión preliminar.

Nota

Los controladores de vista previa de 32 bits deben usar AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C} cuando se instalan en sistemas operativos de 64 bits.

 

Compilar controladores de vista previa

Cómo registrar un controlador de vista previa

Directrices del controlador de versión preliminar