注册筛选器处理程序
必须注册筛选器处理程序。 还可以通过注册表或使用 ILoadFilter 接口查找给定文件扩展名的现有筛选器处理程序。
本主题的组织方式如下:
注意
筛选器处理程序是 IFilter 接口的实现。
注册 Windows 搜索的筛选器处理程序
下表列出了注册新协议处理程序或查找现有协议处理程序所需的 GUID。
GUID | 用户或应用程序定义 | 说明 |
---|---|---|
89BCB740-6119-101A-BCB7-00DD010655AF | 应用程序 | 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。
注册新的筛选器处理程序:
- 指定将使用筛选器处理程序的扩展和持久性处理程序 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}
- 使用以下键和值注册筛选器处理程序:
HKEY_LOCAL_MACHINE
Software
Classes
CLSID
{FilterHandlerCLSID}
(Default) = {DescriptiveFilterHandlerName}
InprocServer32
(Default) = DLL Install Path
ThreadingModel = Both
注册筛选器处理程序的过时方法
不建议使用此方法。 可以为表示组件对象模型的 CLSID 注册筛选器 (COM) 类和/或文件扩展名。 如果需要为类注册筛选器处理程序,可以为类中的文件扩展名注册不同的筛选器处理程序,可以注册这两个筛选器。 请注意,为文件扩展名注册的筛选器处理程序优先于 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。
若要查找给定文件扩展名的筛选器处理程序,请执行以下操作:
- 检查筛选的文件类型的扩展是否在注册表项 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes.extension 下注册了永久性处理程序。 如果是,请让此密钥为 {PersistentHandlerGUID}。
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{PersistentHandlerGUID}
- 如果没有为扩展注册永久性处理程序,请在注册表项 \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}
- 确定永久性处理程序的 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}
- 确定筛选器处理程序:使用在上一步中确定的 {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
其他资源
- GitHub 上提供的 IFilterSample 代码示例演示如何创建用于实现 IFilter 接口的 IFilter 基类。
- 有关索引过程的概述,请参阅 索引过程。
- 有关文件类型的概述,请参阅 文件类型。
- 若要查询文件类型的文件关联属性,请参阅 PerceivedTypes、SystemFileAssociations 和应用程序注册。