Поделиться через


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

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

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

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

Обработчик предварительного просмотра — это встроенное приложение. Хосты включают Проводник 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), и другой для обработчиков, отказавшихся от такого поведения.

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

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

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

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

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

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

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

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

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

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

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

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

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

Заметка

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

 

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

Регистрация обработчика предпросмотра

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