在 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 :
- 確保效能和未來的相容性。
- 協助提高安全性。 使用 IPersistStream 實作的 IFilters 更安全,因為 IFilter 介面執行的內容不需要開啟磁片或透過網路開啟檔案的許可權。
- 雖然 Windows 搜尋只使用 IPersistStream, 但 IFilter 介面類別別也可以繼承 IPersistFile 介面 和/或 IPersistStorage 介面 實作,以取得回溯相容性。
這些介面會在 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。 |
其他資源
- GitHub上提供的IFilterSample程式碼範例示範如何建立 IFilter 基類來實作IFilter介面。
- 如需編制索引程式的概觀,請參閱 編制索引進程。
- 如需檔案類型的概觀,請參閱 檔案類型。
- 若要查詢檔案類型的檔案關聯屬性,請參閱 PerceivedTypes、SystemFileAssociations 和應用程式註冊。