篩選處理常式是 IFilter 介面的實作,會掃描檔中的文字和屬性。 篩選處理常式會從這些專案擷取文字區塊,篩選掉內嵌格式,並保留文字位置的相關資訊。 它們也會擷取值區塊,這些值是文件屬性。 IFilter 是建置較高層級應用程式的基礎,例如檔索引子和與應用程式無關的檢視器。
本主題的組織方式如下:
關於 IFilter 介面
Microsoft Windows 搜尋會使用篩選器來擷取項目的內容,進而納入全文檢索索引中。 您可以藉由撰寫過濾器來擷取內容,以及使用屬性處理程序來擷取檔案的屬性,以擴充 Windows 搜尋功能,使其能夠為新的或專屬的檔案類型編製索引。
IFilter 介面旨在滿足全文搜尋引擎的特定需求。 Windows 搜尋 (例如) 全文檢索搜尋引擎會呼叫 IFilter 方法來擷取文字和屬性資訊,並將其新增至索引。 Windows 搜尋會將傳回的 IFilter::GetText 方法的結果分成單字、正規化它們,並將它們儲存在索引中。 如果可用,搜尋引擎會使用文字區塊的語言代碼識別碼 (LCID) 來執行語言特定的斷詞和正規化。
Windows 搜尋會使用下表所述的三個函式來存取已註冊的篩選處理常式 ( IFilter 介面的實作) 。 這些函式在載入並繫結至內嵌物件的篩選處理常式時特別有用。
| 功能 | Description |
|---|---|
| 載入IFilter | 獲得與指定內容類型最相符的 IFilter 指標。 |
| BindIFilterFromStorage | 取得最適合 IStorage 介面物件中所包含內容的 IFilter 指標。 |
| BindIFilterFromStream | 取得指向IFilter的指標,該指標最適合用來從流變數中擷取指定的類別識別碼(CLSID)。 |
IFilter 介面有五個方法,如下表所述。
| 方法 | Description |
|---|---|
| IFilter::初始化 | 初始化篩選會話。 |
| IFilter::GetChunk | 將 IFilter 放在第一個或下一個區塊的開頭,並傳回描述元。 |
| IFilter::GetText | 從目前區塊擷取文字。 |
| IFilter::GetValue | 從目前區塊擷取值。 |
| IFilter::BindRegion | 擷取代表物件指定部分的介面。 保留供未來使用。 |
隔離過程
Windows 搜尋會在本機系統安全性上下文中執行 IFilters,並以受限制的權限運行。 在此 IFilter 主機隔離程式中,會移除一些許可權:
- 受限制的程式碼
- 每個人
- Local
- 互動式
- 已驗證的使用者
- 內建使用者
- 使用者的安全性識別碼 (SID)
移除這些許可權表示 IFilter 介面無法存取磁碟系統或網路,或任何使用者介面或剪貼簿函式。 此外,隔離程序會在工作物件下執行,以防止建立子程序,並對工作集施加 100 MB 的限制。 IFilter 介面主機隔離程式會增加索引平臺的穩定性,因為可能無法正確實作第三方篩選。
備註
必須撰寫篩選處理常式來管理緩衝區,並正確堆疊。 所有字串複本都必須有明確的檢查,以防止緩衝區溢出。 您應該一律驗證緩衝區的分配大小。 您應該一律將資料的大小與緩衝區的大小比較。
IFilter dll檔案
Iilter DLL 會實作 IFilter 介面,讓用戶端能夠從檔案類型、類別或感知的類型擷取文字和屬性值資訊。 Windows 搜尋篩選程式 SearchFilterHost.exe 系結至專案類別、感知類型或副檔名註冊的 IFilter 。
IFilter 結構
每個 IFilter 都是 DLL 檔案,可實作同進程元件物件模型 (COM) 伺服器,以提供指定的篩選功能。 下圖顯示一般 IFilter DLL 的整體結構。 更複雜的範例可能會實作多個 IFilter 類別。
原生代碼
篩選必須以原生程式碼撰寫,因為執行多個增益集的進程可能會發生 Common Language Runtime (CLR) 版本設定問題。 在 Windows 7 和更新版本中,會明確封鎖以 Managed 程式碼撰寫的篩選。
尋找 IFilter 類別識別碼
IFilter DLL 的類別會在 PersistentHandler 登錄機碼下註冊。 下列範例適用於 HTML 檔案,說明如何尋找 HTML 檔的 IFilter DLL。 此範例遵循類似於系統用來尋找與專案相關聯的 IFilter 的邏輯。
- 檢查 DLL 篩選的檔案類型副檔名是否已在登錄項目 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes 下註冊了 PersistentHandler。 讓這個鍵是
Value1。 如果該項目已存在,請跳至此程序的步驟 4 並在Value1該金鑰中使用。 值的類型為 REG_SZ。
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- 或者,如果沒有為延伸模組註冊 PersistentHandler,請在登錄專案 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes下尋找與檔類型相關聯的 CLSID 。 讓這個鍵是
Value2。
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
CLSID
{25336920-03F9-11CF-8FD0-00AA00686F13}
- 判斷 CLSID 是否已註冊 PersistentHandler。 使用在步驟 2 中確定的
Value2,尋找 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 項目的 PersistentHandler。 讓這個鍵是Value3。
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- 判斷 IFilter 持續性處理常式 GUID。 使用
Value1和Value3,尋找檔類型的 IFilter 持續處理常式 GUID。 登錄項目 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 或 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> 底下的值提供此文件類型的 IFilter PersistentHandler GUID。 讓這個鍵是Value4。 在此範例中, IFilter 介面 GUID 是 89BCB740-6119-101A-BCB7-00DD010655AF。
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
{EEC97550-47A9-11CF-B952-00AA0051FE20}
= HTML File Persistent Handler
Data type REG_SZ
PersistentAddinsRegistered
{89BCB740-6119-101A-BCB7-00DD010655AF}
Data type REG_SZ
default = {E0CA5340-4534-11CF-B952-00AA0051FE20}
備註
在此範例中,HTML 檔的 IFilter DLL 是 nlhtml.dll。
IFilter::GetChunk 和地區設定程式碼識別碼
文字的 LCID 可以在單一檔案內變更。 例如,說明手冊的文字可能會在英文 (en-us) 和西班牙文 (es) 之間交替使用,或者文字可能包含主要語言以外的語言的單一單字。 在任一情況下,每次 LCID 變更時,您的 IFilter 都必須開始新的區塊。 因為 LCID 是用來選擇適當的斷詞工具,所以正確識別它非常重要。 如果 IFilter 無法判斷文字的地區設定,則它應該傳回零的 LCID 與區塊。 傳回零的 LCID 會導致 Windows 搜尋使用語言自動偵測 (LAD) 技術來判斷區塊的地區設定識別碼。 如果 Windows 搜尋找不到相符項目,則會預設為系統預設地區設定(透過呼叫 GetSystemDefaultLocaleName 函數)。 如需詳細資訊,請參閱 IFilter::GetChunk、 CHUNK_BREAKTYPE、 CHUNKSTATE 和 STAT_CHUNK。
如果您控制檔案格式,且目前不包含地區設定資訊,則應新增使用者功能,以啟用適當的地區設定識別。 使用不相符的斷詞工具可能會導致使用者的查詢體驗不佳。 如需詳細資訊,請參閱 IWordBreaker。
備註
篩選器與檔案類型相關聯,如副檔名、MIME 類型或 CLSID 所表示。 雖然一個過濾器可以處理多種文件類型,但每種類型只能使用一個過濾器。
其他資源
- GitHub 上提供的 IFilterSample 程式碼範例示範如何建立 IFilter 基類來實作 IFilter 介面。
- 如需索引程序的概觀,請參閱 索引程序。
- 如需檔案類型的概觀,請參閱 檔案類型。
- 若要查詢檔案類型的檔案關聯屬性,請參閱 PerceivedTypes、SystemFileAssociations 和 Application Registration。