预览处理程序和 Shell 预览主机

当选择某个项以在视图的阅读窗格中显示文件内容的轻型、丰富的 只读 预览时,将调用预览处理程序。 无需启动文件的关联应用程序即可完成此操作。

本主题讨论以下主题:

预览处理程序体系结构

预览处理程序是托管的应用程序。 主机包括 Windows Vista 或 Microsoft Outlook 2007 中的 Windows 资源管理器。 主机实现 IPreviewHandlerFrame 作为预览处理程序和主机之间的通信方法。

预览处理程序本身实现以下接口:

处理程序通过其 IObjectWithSite 调用,该站点返回 IUnknown 指针,通过该指针请求 IPreviewHandlerFrame 对象与主机交互。

服务器模型选项

预览处理程序始终在进程外运行。 可通过两种方法实现此方案:

  1. 预览处理程序可以生成为进程内服务器,但通过进程外代理主机运行。 这是首选方法。 系统在 Prevhost.exe 文件中为此提供代理项主机。 此方法生成的预览处理程序与 Windows XP 上的 Outlook 2007 不兼容。 但是,这些相同的处理程序将在 Windows 资源管理器和在 Windows Vista 上运行的 Outlook 2007 中运行。
  2. 预览处理程序可以生成为本地组件对象模型 (COM) 服务器。 出于多种原因,不建议这样做。 首先,进程内服务器的实现更容易。 更重要的是,作为进程内服务器的实现可以更好地控制处理程序对象的生存期,从而提高清理和效率。

默认情况下,出于安全原因,预览处理程序在低完整性级别 (IL) 进程中运行。 可以选择通过在注册表中设置以下值来禁用低 IL 进程的运行。 但是,不建议这样做。 系统最终可以配置为拒绝任何不低 IL 的进程。

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

默认情况下,不同的预览处理程序共享相同的进程。 Prevhost.exe的两个实例可以同时运行;一个用于作为低 IL 进程运行的处理程序,一个用于已选择退出该行为的处理程序。

初始化

与缩略图和属性处理程序一样,强烈建议使用流初始化处理程序。 如有必要,可以通过文件或项进行初始化,但流提供了实现处理程序的最安全方法。 通过流进行初始化可确保文件完整性和稳定性,使系统能够从低 IL 进程运行处理程序(例如,保护系统免受缓冲区溢出、限制处理程序写入信息的位置以及限制与其他窗口的通信)。

如果必须使用文件或 Shell 项进行初始化,请存储文件路径或对 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 进程,一个用于那些已选择退出作为低 IL 进程运行的处理程序。

如果在可用进程列表中找不到Prevhost.exe,则可能是该进程当时尚未加载。 单击预览文件将加载代理项,然后它应显示为可附加进程。

为预览处理程序提供你自己的进程

如果要强制为处理程序创建新进程而不是在默认进程下运行,请在 AppID 下为处理程序创建新的子项,并将其 DllSurrogate 条目设置为“Prevhost.exe”。 使用该 AppID 子项而不是默认Prevhost.exe AppID

通过提供新进程,处理程序可以避免在共享进程下运行,就像默认情况下那样。 例如,这可以让你确保特定版本的公共语言运行时 (CLR) 进程中。 如果要生成预览处理程序的托管实现,则这是必需的。

注意

在 64 位操作系统上安装时,32 位预览处理程序应使用 AppID {534A1E02-D58F-44f0-B58B-36CBED287C7C}。

 

生成预览处理程序

如何注册预览处理程序

预览处理程序指南