Обработчики предварительного просмотра и узел предварительной версии оболочки
Обработчики предварительного просмотра вызываются при выборе элемента для отображения упрощенного, полнофункционированного и доступного только для чтения предварительного просмотра содержимого файла в области чтения представления. Это делается без запуска связанного приложения файла.
В этом разделе рассматриваются следующие темы:
- Архитектура обработчика предварительной версии
- Параметры модели сервера
- Инициализация
- Поток данных обработчика предварительной версии
- Отладка обработчика предварительной версии
- Предоставление собственного процесса для обработчика предварительной версии
- Связанные разделы
Архитектура обработчика предварительной версии
Обработчик предварительного просмотра — это размещенное приложение. Узлы включают обозреватель Windows в Windows Vista или Microsoft Outlook 2007. Узлы реализуют IPreviewHandlerFrame в качестве метода взаимодействия между обработчиком предварительной версии и узлом.
Сам обработчик предварительного просмотра реализует следующие интерфейсы:
- IInitializeWithStream
- IObjectWithSite
- IOleWindow
- IPreviewHandler
- IPreviewHandlerVisuals (необязательно)
Обработчик вызывается через IObjectWithSite, который возвращает указатель IUnknown , через который запрашивается объект IPreviewHandlerFrame для взаимодействия с узлом.
Параметры модели сервера
Обработчики предварительного просмотра всегда выполняются без обработки. Существует два метода реализации:
- Обработчик предварительной версии можно создать как внутрипроцессный сервер, но запустить его через внепроцессный суррогатный узел. Это является предпочтительным методом. Система предоставляет суррогатный узел для этого в файле Prevhost.exe. Обработчики предварительной версии, созданные этим методом, несовместимы с Outlook 2007 в Windows XP. Однако эти же обработчики будут работать в обозревателе Windows и Outlook 2007, запущенных в Windows Vista.
- Обработчик предварительной версии можно создать как локальный сервер объектной модели компонентов (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.
- Обработчик предварительного просмотра инициализируется предпочтительно с помощью потока.
- Окно представления передается от узла в обработчик через IPreviewHandler::SetWindow.
- На этом этапе обработчик не должен выполнять никаких действий до вызова IPreviewHandler::D oPreview .
- Предварительный просмотр отображается в области чтения с помощью вызова IPreviewHandler::D oPreview.
- Размер окна задается с помощью IPreviewHandler::SetRect.
- Размер окна изменяется при необходимости с помощью IPreviewHandler::SetRect.
- Предварительная версия выгружается и ее ресурсы освобождаются, когда он больше не нужен, с помощью вызова 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-разрядных операционных системах.
Связанные темы