Share via


在 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 移除為登錄中的持續性處理常式。 您可以使用 旗標執行 regsvr32.exe 程式 /u 來取消註冊 DLL: regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject 函式 內容索引用戶端會透過元件物件模型 (COM) 呼叫 DllGetClassObject 函 式進入點,以建立 IFilter 介面的類別處理站物件,以及取得該物件的 Class Factory 介面指標。
DllCanUnloadNow 函式 內容索引用戶端會透過 COM 呼叫 DllCanUnloadNow 函 式進入點,以判斷是否可以卸載 IFilter DLL。 IFilter介面會在未使用一段時間後卸載,如 FilterIdleTimeOut 登錄值所指定。

實作 IFilter 類別和 Class Factory

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

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 方法。

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

其他資源

開發篩選處理常式

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

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

從篩選處理常式傳回屬性

隨附于 Windows 的篩選處理常式

註冊篩選處理常式

測試篩選處理常式