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


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

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

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

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

Обработчик предварительного просмотра — это размещенное приложение. Узлы включают 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::D oPreview .

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

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

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

  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-разрядных операционных системах.

 

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

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

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