预览处理程序和 Shell 预览主机
当选择某个项以在视图的阅读窗格中显示文件内容的轻型、丰富的 只读 预览时,将调用预览处理程序。 无需启动文件的关联应用程序即可完成此操作。
本主题讨论以下主题:
预览处理程序体系结构
预览处理程序是托管的应用程序。 主机包括 Windows Vista 或 Microsoft Outlook 2007 中的 Windows 资源管理器。 主机实现 IPreviewHandlerFrame 作为预览处理程序和主机之间的通信方法。
预览处理程序本身实现以下接口:
处理程序通过其 IObjectWithSite 调用,该站点返回 IUnknown 指针,通过该指针请求 IPreviewHandlerFrame 对象与主机交互。
服务器模型选项
预览处理程序始终在进程外运行。 可通过两种方法实现此方案:
- 预览处理程序可以生成为进程内服务器,但通过进程外代理主机运行。 这是首选方法。 系统在 Prevhost.exe 文件中为此提供代理项主机。 此方法生成的预览处理程序与 Windows XP 上的 Outlook 2007 不兼容。 但是,这些相同的处理程序将在 Windows 资源管理器和在 Windows Vista 上运行的 Outlook 2007 中运行。
- 预览处理程序可以生成为本地组件对象模型 (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 资源管理器。
- 预览处理程序已初始化,最好是使用流。
- 视图窗口通过 IPreviewHandler::SetWindow 从主机传递到处理程序。
- 此时,在调用 IPreviewHandler::D oPreview 之前,处理程序不应再执行任何操作。
- 预览通过调用 IPreviewHandler::D oPreview 显示在阅读窗格中。
- 窗口的大小通过 IPreviewHandler::SetRect 设置。
- 根据需要通过 IPreviewHandler::SetRect 调整窗口大小。
- 通过调用 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}。
相关主题