注册过滤器处理程序

您的筛选器处理程序必须注册。 还可以通过注册表或使用 ILoadFilter 接口查找给定文件扩展名的现有筛选器处理程序。

本主题按如下所示进行组织:

注释

筛选器处理程序是 IFilter 接口的实现。

下表列出了注册新协议处理程序或查找现有协议处理程序所需的 GUID。

GUID 用户或应用程序定义的 Description
89BCB740-6119-101A-BCB7-00DD010655AF Application IFilter 接口 GUID 是所有筛选器处理程序的注册表项常量。
{PersistentHandlerGUID} 用户 这是持久处理程序的 GUID。
{FilterHandlerCLSID} 用户 这是筛选器处理程序的类标识符(CLSID)。
{ApplicationGUID} 用户 这是一个中间(聚合的)GUID。

筛选器处理程序必须在HKEY_LOCAL_MACHINE中注册,因为 SearchFilterHost.exe 在 SYSTEM 帐户下运行,因此无法访问登录用户的HKEY_CURRENT_USER注册表项。 此外,用户组必须对.DLL文件本身拥有读取和执行权限,因为SearchFilterHost.exe会删除所有管理员权限,并且仅允许非管理员权限。 由于默认 Visual Studio 项目位置位于当前用户的目录中,因此不向用户组授予读取权限,因此必须移动 .dll 或更改 ACL 以允许 SearchFilterHost.exe 访问。

注册新的筛选器处理程序时,建议使用描述性名称,例如 HTML IFilter。

注册新的筛选器处理程序:

  1. 指定将使用筛选器处理程序的扩展和持久处理程序 GUID:
    HKEY_LOCAL_MACHINE
       Software
          Classes
             .txt
                PersistentHandler
                   (Default) = {PersistentHandlerGUID}
    HKEY_LOCAL_MACHINE
       Software
          Classes
             CLSID
                {PersistentHandlerGUID}
                   PersistentAddinsRegistered
                      {89BCB740-6119-101A-BCB7-00DD010655AF}l
                         (Default) = {FilterHandlerCLSID}
  1. 使用以下键和值注册筛选器处理程序:
    HKEY_LOCAL_MACHINE
       Software
          Classes
             CLSID
                {FilterHandlerCLSID}
                   (Default) = {DescriptiveFilterHandlerName}
                   InprocServer32
                      (Default) = DLL Install Path
                      ThreadingModel = Both

用于注册筛选器处理程序的过时方法

不建议使用此方法。 可以为表示组件对象模型 (COM) 类和/或文件扩展名的 CLSID 注册筛选器。 如果需要为一个类注册筛选器处理程序,并且需要为该类中的文件名扩展名注册不同的筛选器处理程序,则可以同时注册这两个筛选器。 请注意,为文件扩展名注册的筛选器处理程序优先于 CLSID 的筛选器处理程序。

这些条目是标准 OLE 注册表项,最多包括类 CLSID\{ApplicationGUID} 的条目。 DLL sample.dll 实现 .txt 类的正在运行的对象行为。 请注意额外的条目 PersistentHandler。 此条目指定负责将请求代理到示例类的持久性对象的类。 PersistentAddinsRegistered下的条目识别出负责实现名为89BCB740-6119-101A-BCB7-00DD010655AF(IID_IFilter)接口的组件。 实现 IID_IFilter的 类具有标准的 OLE 注册表项。 InprocServer32 DLL 通过标准 OLE 机制加载。

Windows 搜索观察为筛选器处理程序指定的线程模型。 当线程模型设置为 双时,筛选器处理程序必须是线程安全的;否则,如果它不是线程安全的,请指定 单元。 请注意,筛选器处理程序应始终是线程安全的。

以下示例注册表项适用于为类和文件扩展名注册的筛选器处理程序。 {PersistentHandlerGUID} 和 {FilterHandlerCLSID} 用作指示筛选器处理程序创建者需要指定的值的变量。 这些值的类型为REG_SZ。

HKEY_LOCAL_MACHINE
   Software
      Classes
         .txt
            (Default) = SampleFile
         SampleFile
            (Default) = Class for Sample Files
            CLSID
               (Default) = {ApplicationGUID}
         CLSID
            {ApplicationGUID}
               (Default) = Sample Files
               InprocServer32
                  (Default) = sample.dll
               PersistentHandler
                  (Default) = {PersistentHandlerGUID}
            {PersistentHandlerGUID}
               (Default) = Sample file persistent handler
               PersistentAddinsRegistered
                  {89BCB740-6119-101A-BCB7-00DD010655AF}l
                     (Default) = {FilterHandlerCLSID}
            {FilterHandlerCLSID}
               (Default) = Sample Files
               InprocServer32
                  (Default) = sampfilt.dll
                  ThreadingModel = Both

替换现有筛选器处理程序

建议不要替换常见文件类型(如 .txt、.doc、.html、.url 等)的内置筛选器处理程序,因为这样做可能会对其他系统组件产生意外的影响。 例如,为电子邮件正文编制索引取决于 .txt、.html和.rtf筛选器处理程序。

如果将一个新的文件类型的筛选器处理程序安装为替代现有筛选器注册的项目,则安装程序应保存当前注册,并在卸载新的筛选器处理程序时恢复原先的注册。 没有链式筛选器的机制。 因此,新的筛选器处理程序负责复制旧筛选器的任何必要功能。

查找给定文件扩展名的筛选器处理程序

可以使用 ILoadFilter 接口查找给定文件扩展名的筛选器处理程序。 以下示例注册表项说明了如何对 HTML 文件执行此作。 在此示例中,HTML 文档的过滤处理程序是 nlhtml.dll。 这些值的类型为REG_SZ。

若要查找给定文件扩展名的筛选器处理程序,请执行以下作:

  1. 检查过滤的文件类型的扩展名是否在注册表项 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes.extension 下注册了持久性处理程序。 如果是这样,请让此密钥为 {PersistentHandlerGUID}。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {PersistentHandlerGUID}
  1. 如果没有为扩展注册永久性处理程序,请在注册表项 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes中找到与文档类型关联的 CLSID。 让此密钥成为 {ApplicationGUID}。 然后确定是否为 CLSID 注册了永久性处理程序:使用 {ApplicationGUID} 查找 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{ApplicationGUID} 条目的永久性处理程序。 让此密钥成为 {PersistentHandlerGUID}。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                (Default) = Class for WWW HTML files
                CLSID
                   (Default) = {25336920-03F9-11CF-8FD0-00AA00686F13}
             CLSID
                {25336920-03F9-11CF-8FD0-00AA00686F13}
                   PersistentHandler
                      (Default) = {PersistentHandlerGUID}
  1. 确定持久性处理程序的 GUID:使用 {PersistentHandlerGUID} 查找文档类型的持久处理程序 GUID。 注册表项下的值 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{PersistentHandlerGUID}\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF 生成此文档类型的持久处理程序 GUID。 让此密钥为 {FilterHandlerCLSID}。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {PersistentHandlerGUID}
                (Default) = HTML File Persistent Handler<dl>
                    REG_SZ     {89BCB740-6119-101A-BCB7-00DD010655AF}
                    REG_SZ     (Default) = {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. 确定筛选器处理程序:使用在上一步中确定的 {FilterHandlerCLSID} 在条目 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{FilterHandlerCLSID}\InprocServer32下找到筛选器处理程序。 在此示例中,使用的描述性筛选器处理程序名称是 HTML IFilter。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             CLSID
                {EEC97550-47A9-11CF-B952-00AA0051FE20}
                   (Default) = HTML IFilter
                    Data type  REG_SZ
                    InprocServer32
                    nlhtml.dll

其他资源

开发筛选器处理程序

关于 Windows 搜索中的过滤器处理程序

在 Windows 搜索中创建筛选器处理程序的最佳做法

从筛选器处理程序返回属性

随 Windows 一起交付的筛选器处理程序

在 Windows 搜索中实现筛选器处理程序

测试筛选器处理程序