Предварительный просмотр обработчиков и узла предварительной версии оболочки
Обработчики предварительного просмотра вызываются, когда элемент выбран для отображения упрощенного, полнофункционального, только для чтения предварительного просмотра содержимого файла в области чтения представления. Это делается без запуска связанного приложения файла.
В этом разделе рассматриваются следующие разделы:
- Архитектура обработчика предварительного просмотра
- Параметры модели сервера
- Инициализация
- Поток данных обработчика предварительного просмотра
- Отладка обработчика предварительного просмотра
- предоставление собственного процесса для обработчика предварительной версии
- Связанные темы
Архитектура обработчика предварительного просмотра
Обработчик предварительного просмотра — это встроенное приложение. Хосты включают Проводник 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), и другой для обработчиков, отказавшихся от такого поведения.
Инициализация
Как и в случае с обработчиками эскизов и свойств, настоятельно рекомендуется инициализировать обработчик с помощью потока. При необходимости можно инициализировать файл или элемент, но потоки предоставляют наиболее безопасный способ реализации обработчика. Инициализация через поток обеспечивает целостность файлов и преимущества стабильности для системы запуска обработчика в качестве низкого процесса IL, например защиты системы от переполнения буфера, ограничения того, где обработчик может записывать информацию и ограничивать взаимодействие с другими окнами.
Если необходимо инициализировать файл или элемент оболочки, сохраните путь к файлу или ссылку на IShellItem. Не считывайте данные из этих источников, пока не вызывается IPreviewHandler::DoPreview.
Как правило, инициализация не должна выполнять тяжелую работу, например создание и хранение образа предварительного просмотра. Для достижения оптимальной эффективности подобная обработка не должна выполняться, пока не будет запрошен просмотр.
Поток данных обработчика предварительного просмотра
Поток данных в процессе предварительного просмотра следует общему пути, показанному здесь. Хост можно сравнить с проводником Windows в Windows Vista или Outlook 2007.
- Обработчик предварительного просмотра инициализируется предпочтительно с потоком.
- Окно представления передается от узла обработчику через IPreviewHandler::SetWindow.
- На этом этапе обработчик не должен делать ничего больше, пока не будет вызвана IPreviewHandler::DoPreview.
- Предварительный просмотр отображается в области чтения после вызова IPreviewHandler::DoPreview.
- Размер окна устанавливается через IPreviewHandler::SetRect.
- При необходимости размер окна изменяется с помощью IPreviewHandler::SetRect.
- Предварительный просмотр выгружается, и его ресурсы освобождаются через вызов 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-разрядных операционных системах.
Связанные разделы