請務必瞭解篩選處理程式的必要 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,原因如下:
- 確保效能和未來的相容性。
- 協助提高安全性。 使用 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 方法。
不需要的方法 | 描述 |
---|---|
IPersistStream::IsDirty | 篩選器應返回E_NOTIMPL。 |
IPersistStream::Save | 篩選應該會傳回E_NOTIMPL。 |
IPersistStream::GetSizeMax | 篩選應該會傳回E_NOTIMPL。 |
IFilter::BindRegion | 篩選器應回傳 E_NOTIMPL。 |
其他資源
- GitHub上提供的 IFilterSample 程式代碼範例會示範如何建立 IFilter 基類來實作 IFilter 介面。
- 如需編製索引程式的概觀,請參閱 索引處理。
- 如需檔案類型的概觀,請參閱 檔案類型。
- 若要查詢檔案類型的檔案關聯屬性,請參閱 PerceivedTypes、SystemFileAssociations 和應用程式註冊。
相關主題
瞭解 Windows 搜尋 中的篩選處理程式
在 Windows 搜尋服務中建立篩選處理程式的 最佳做法
隨附於 Windows 的 篩選處理程式