Обработчики предварительного просмотра и узел предварительной версии оболочки

Обработчики предварительного просмотра вызываются при выборе элемента для отображения упрощенного, полнофункционированного и доступного только для чтения предварительного просмотра содержимого файла в области чтения представления. Это делается без запуска связанного приложения файла.

В этом разделе рассматриваются следующие темы:

Архитектура обработчика предварительной версии

Обработчик предварительного просмотра — это размещенное приложение. Узлы включают обозреватель Windows в Windows Vista или Microsoft Outlook 2007. Узлы реализуют IPreviewHandlerFrame в качестве метода взаимодействия между обработчиком предварительной версии и узлом.

Сам обработчик предварительного просмотра реализует следующие интерфейсы:

Обработчик вызывается через IObjectWithSite, который возвращает указатель IUnknown , через который запрашивается объект IPreviewHandlerFrame для взаимодействия с узлом.

Параметры модели сервера

Обработчики предварительного просмотра всегда выполняются без обработки. Существует два метода реализации:

  1. Обработчик предварительной версии можно создать как внутрипроцессный сервер, но запустить его через внепроцессный суррогатный узел. Это является предпочтительным методом. Система предоставляет суррогатный узел для этого в файле Prevhost.exe. Обработчики предварительной версии, созданные этим методом, несовместимы с Outlook 2007 в Windows XP. Однако эти же обработчики будут работать в обозревателе Windows и Outlook 2007, запущенных в Windows Vista.
  2. Обработчик предварительной версии можно создать как локальный сервер объектной модели компонентов (COM). Это не рекомендуется по нескольким причинам. Во-первых, проще реализовать внутрипроцессный сервер. Более важно, что реализация в качестве внутрипроцессного сервера обеспечивает больший контроль над временем существования объекта обработчика, что обеспечивает лучшую очистку и эффективность.

По умолчанию обработчики предварительной версии выполняются в процессе низкого уровня целостности (IL) по соображениям безопасности. При необходимости можно отключить запуск как процесс с низким значением IL, задав в реестре следующее значение. Однако это не рекомендуется делать. Системы в конечном итоге можно настроить таким образом, чтобы отклонить любой процесс, который не является низким il.

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

По умолчанию разные обработчики предварительной версии используют один и тот же процесс. Два экземпляра Prevhost.exe могут выполняться одновременно; один для обработчиков, выполняющихся в качестве низкоуровневых процессов, один для обработчиков, которые отказались от этого поведения.

Инициализация

Как и в случае с обработчиками эскизов и свойств, настоятельно рекомендуется инициализировать обработчик с помощью потока. При необходимости можно инициализировать файл или элемент, но потоки обеспечивают наиболее безопасный способ реализации обработчика. Инициализация с помощью потока обеспечивает целостность файлов и преимущества стабильности для системы запуска обработчика в качестве процесса с низким значением IL, таким как защита системы от переполнения буфера, ограничение места записи информации обработчиком и ограничение обмена данными с другими окнами.

Если необходимо инициализировать файл или элемент оболочки, сохраните путь к файлу или ссылку на IShellItem. Не считывайте данные из этих источников до вызова IPreviewHandler::D oPreview .

Как правило, инициализация не должна выполнять тяжелые действия, такие как создание и хранение образа предварительного просмотра. Для оптимальной эффективности обработка такого рода не должна выполняться до тех пор, пока не будет вызвана предварительная версия.

Поток данных обработчика предварительной версии

Поток данных в процессе предварительного просмотра соответствует общему пути, показанном здесь. Узел можно рассматривать как обозреватель Windows в Windows Vista или Outlook 2007.

  1. Обработчик предварительного просмотра инициализируется предпочтительно с помощью потока.
  2. Окно представления передается от узла в обработчик через IPreviewHandler::SetWindow.
  3. На этом этапе обработчик не должен выполнять никаких действий до вызова IPreviewHandler::D oPreview .
  4. Предварительный просмотр отображается в области чтения с помощью вызова IPreviewHandler::D oPreview.
  5. Размер окна задается с помощью IPreviewHandler::SetRect.
  6. Размер окна изменяется при необходимости с помощью IPreviewHandler::SetRect.
  7. Предварительная версия выгружается и ее ресурсы освобождаются, когда он больше не нужен, с помощью вызова IPreviewHandler::Unload.

Отладка обработчика предварительной версии

Если вы выполнили рекомендации по реализации обработчика предварительной версии в качестве внутрипроцессного сервера, для отладки обработчика предварительной версии можно подключиться к Prevhost.exe. Как упоминалось ранее, следует помнить, что может существовать два экземпляра Prevhost.exe: один для обычных низкоуровневых процессов и один для тех обработчиков, которые отказались от выполнения в качестве низкой il-процесса.

Если вы не найдете Prevhost.exe в списке доступных процессов, вероятно, она не была загружена в этот момент. Если щелкнуть файл для предварительного просмотра, он загружает суррогат, и он должен отображаться как присоединенный процесс.

Предоставление собственного процесса для обработчика предварительной версии

Если вы хотите принудительно создать новый процесс для обработчика, а не выполняться в процессе по умолчанию, создайте новый подраздел для обработчика в AppID и задайте для его записи DllSurrogate значение "Prevhost.exe". Используйте этот подраздел AppID вместо Prevhost.exe AppID по умолчанию.

Предоставляя новый процесс, обработчик может избежать выполнения в общем процессе, как это было бы по умолчанию. Это может позволить, например, обеспечить конкретную версию среды CLR в процессе. Это необходимо, если вы создаете управляемую реализацию обработчика предварительной версии.

Примечание

32-разрядные обработчики предварительной версии должны использовать AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C} при установке в 64-разрядных операционных системах.

 

Создание обработчиков предварительной версии

Регистрация обработчика предварительной версии

Рекомендации по обработчику предварительной версии