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

必须了解筛选器处理程序所需的 DLL 结构( IFilter 接口的实现)。

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

实现和导出 DLL 入口点

每个 IFilter DLL(本节中的 Ifilter.dll 表示)都必须实现并导出以下入口点。 这些入口点通常使用 IFilter 接口的模块定义 (.def) 文件或使用 __declspec(dllexport) 关键字导出。 DLL 文件可以注册到任何文件夹中,但它通常驻留在 %SystemRoot%\system32 文件夹中。

下表列出了 DLL 入口点,如下表所述。

DLL 名称 DLL 说明
DllRegisterServer DllRegisterServer 入口点将 DLL 注册为注册表中的筛选器。 通过以 IFilter 接口 DLL 文件名作为参数运行 regsvr32.exe 程序来注册 DLL: regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer 函数 DllUnregisterServer 函数入口点从注册表中移除 DLL 作为持久性处理程序。 请使用标志 /u 运行 regsvr32.exe 程序来注销 DLL:regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject 函数 内容索引客户端通过组件对象模型(COM)调用 DllGetClassObject 函数 入口点,为 IFilter 接口创建类工厂对象,并获取指向该对象的类工厂接口的指针。
DllCanUnloadNow 函数 内容索引客户端通过 COM 调用 DllCanUnloadNow 函数 入口点,以确定是否可以卸载 IFilter DLL。 IFilter 接口在一段时间内未使用(由 FilterIdleTimeOut 注册表值指定)后卸载。

实现 IFilter 类和类工厂

通常每个 IFilter DLL 实现至少两个类,例如 CFilter 和 CFilterCF 。 CFilter 类生成实现内容筛选功能的 IFilter 接口对象。 其成员函数实现 IFilter 接口的接口方法。 每个 IFilter 类都需要 IFilter 接口实现器生成的唯一类标识符(CLSID)。

CFilterCF 类生成 IFilter 接口的类工厂对象。 类工厂通过其 IClassFactory Interface 接口,由 DLL 的 DllGetClassObject Function 入口点调用。 CFilterCF 类创建 CFilter 对象,并返回指向 IUnknown 的指针。 在更复杂的情况下, IFilter 可以实现类层次结构来代替单个 CFilter 类。

继承 COM 接口

Windows 搜索 3.0 及更高版本要求出于以下原因使用 IPersistStream :

这些接口在 mssdk\include 目录包含的文件中声明,并具有预定义的接口标识符(IID)。 内容索引客户端通过 IUnknown 查询 IFilter 接口,以确定筛选内容时要使用的接口中的哪一个。

实现 COM 接口方法

IFilter 接口实现 IFilter 接口类和 IFilter 接口类工厂的 IUnknown 方法。 下表按 vtable 顺序列出了必须由 IFilter 接口实现的接口和方法,这些都是 IFilter 接口专用的。 IFilter 接口必须至少实现 IPersistStream,但可以实现其他 IPersist 派生接口。

COM 接口 方法
IClassFactory 接口 CreateInstance、LockServer
IClassFactory2 接口 GetLicInfo、RequestLicKey、CreateInstanceLic
IFilter IFilter::Init、 IFilter::GetChunk、 IFilter::GetText、 IFilter::GetValue、 IFilter::BindRegion
IPersist 接口 GetClassID
IPersistFile 接口 IsDirty, Load, Save, SaveCompleted, GetCurFile
IPersistStorage 接口 IsDirty、Load、Save、GetSizeMax
IPersistStream IsDirty、Load、Save、GetSizeMax

每个方法的引用页指定该方法的参数和功能行为。 每个引用页还提供为该方法实现的结果代码。 IFilter 方法的参考页提供了要实现的FACILITY_ITF特定于接口的结果代码,内容索引客户端还可以处理任何泛型结果代码,例如FACILITY_NULL和FACILITY_WIN32。 有关详细信息,请参阅 COM 错误代码的结构。

未实现的 COM 方法

IFilter 接口必须至少实现 IPersistStream,但不需要实现额外的 IPersist 派生接口。

Windows 搜索不需要实现下表中列出的 COM 方法。

不需要的方法 Description
IPersistStream::IsDirty 筛选器应返回E_NOTIMPL。
IPersistStream::Save 筛选器应返回E_NOTIMPL。
IPersistStream::GetSizeMax 筛选器应返回E_NOTIMPL。
IFilter::BindRegion 筛选器应返回E_NOTIMPL。

其他资源

开发筛选器处理程序

了解 Windows 搜索中的筛选器处理程序

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

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

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

注册过滤器处理程序

测试筛选器处理程序