分享方式:


在 Windows 搜尋中實作篩選處理程式

請務必瞭解篩選處理程式的必要 DLL 結構(IFilter 介面的實作)。

本主題的組織方式如下:

實作和匯出 DLL 進入點

每個 IFilter DLL(本節中的 Ifilter.dll 表示)都必須實作並導出下列進入點。 這些進入點通常會使用 IFilter 介面的模組定義 (.def) 檔案,或使用 __declspec(dllexport) 關鍵詞導出。 DLL 檔案可以註冊為在任何資料夾中,但通常位於 \system32 資料夾中 %SystemRoot%。

下表列出並說明 DLL 進入點。

DLL 名稱 DLL 描述
DllRegisterServer DllRegisterServer 進入點會將 DLL 註冊為登錄中的篩選。 您可以使用 IFilter 介面 DLL 檔名作為自變數,以執行 regsvr32.exe 程式來註冊 DLL:regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer 函式 DllUnregisterServer 函式 進入點會將 DLL 移除為登錄中的持續性處理程式。 您可以透過執行 regsvr32.exe 程式並使用 /u 旗標來解除註冊 DLL:regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject 函式 內容索引客戶端會透過元件物件模型(COM)呼叫 DllGetClassObject 函式 進入點,以建立用於 IFilter 介面的類別工廠物件,並取得該物件的類別工廠介面指標。
DllCanUnloadNow 函式 內容索引用戶端會透過 COM 呼叫 DllCanUnloadNow 函式 進入點,以判斷是否可以卸載 IFilter DLL。 IFilter 介面在一段時間後未被使用時會被卸載,根據 FilterIdleTimeOut 登錄值的指定。

實作 IFilter 類別和 Class Factory

每個 IFilter DLL 通常會實作至少兩個類別,例如 CFilter 和 CFilterCF。 CFilter 類別會產生實作內容篩選功能的 IFilter 介面物件。 其成員函式會實作 IFilter 介面的介面方法。 每個 IFilter 類別都需要一個由 IFilter 介面實作器產生的唯一類別識別碼 (CLSID)。

CFilterCF 類別會產生 IFilter 介面的 class-factory 物件。 類別處理站透過其 IClassFactory 介面,由 DLL 的DllGetClassObject 函式 進入點呼叫。 CFilterCF 類別會建立 CFilter 物件,並傳回 IUnknown 的指標。 在更複雜的情況下,IFilter 可以實作類別階層來取代單一 CFilter 類別。

繼承 COM 介面

Windows Search 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:InitIFilter:GetChunkIFilter:GetTextIFilter:GetValueIFilter: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 方法。

不需要的方法 描述
IPersistStream::IsDirty 篩選器應返回E_NOTIMPL。
IPersistStream::Save 篩選應該會傳回E_NOTIMPL。
IPersistStream::GetSizeMax 篩選應該會傳回E_NOTIMPL。
IFilter::BindRegion 篩選器應回傳 E_NOTIMPL。

其他資源

開發篩選處理程式

瞭解 Windows 搜尋 中的篩選處理程式

在 Windows 搜尋服務中建立篩選處理程式的 最佳做法

從篩選處理程式傳回屬性

隨附於 Windows 篩選處理程式

註冊篩選處理程式

測試篩選處理程式