註冊篩選處理常式
您的篩選處理常式必須註冊。 您也可以透過登錄或使用 ILoadFilter 介面,找到指定副檔名的現有篩選處理常式。
本主題的組織方式如下:
注意
篩選處理常式是 IFilter 介面的實作。
註冊 Windows 搜尋的篩選處理常式
下表列出註冊新通訊協定處理常式或尋找現有通訊協定處理常式所需的 GUID。
GUID | 使用者或應用程式定義 | 描述 |
---|---|---|
89BCB740-6119-101A-BCB7-00DD010655AF | Application | IFilter介面 GUID 是所有篩選處理常式的登錄機碼常數。 |
{PersistentHandlerGUID} | User | 這是持續性處理常式的 GUID。 |
{FilterHandlerCLSID} | User | 這是篩選處理常式 (CLSID) 的類別識別碼。 |
{ApplicationGUID} | User | 這是中繼 (匯總) GUID。 |
篩選處理常式必須在 HKEY_LOCAL_MACHINE 中註冊,因為SearchFilterHost.exe是在 SYSTEM 帳戶下執行,因此無法存取登入使用者的HKEY_CURRENT_USER登錄機碼。 此外,使用者群組必須具有篩選處理常式的讀取和執行存取權.dll本身,因為SearchFilterHost.exe會移除所有系統管理員許可權,而且只允許非系統管理員許可權。 由於預設 Visual Studio 專案位置位於目前使用者的目錄中,因此不會授與使用者群組的讀取權限,因此您必須移動.dll或變更 ACL 以允許SearchFilterHost.exe存取。
當您註冊新的篩選處理常式時,建議您使用描述性名稱,例如 HTML IFilter。
若要註冊新的篩選處理常式:
- 指定將使用篩選處理常式的延伸模組和持續性處理常式 GUID:
HKEY_LOCAL_MACHINE
Software
Classes
.txt
PersistentHandler
(Default) = {PersistentHandlerGUID}
HKEY_LOCAL_MACHINE
Software
Classes
CLSID
{PersistentHandlerGUID}
PersistentAddinsRegistered
{89BCB740-6119-101A-BCB7-00DD010655AF}l
(Default) = {FilterHandlerCLSID}
- 使用下列索引鍵和值註冊篩選處理常式:
HKEY_LOCAL_MACHINE
Software
Classes
CLSID
{FilterHandlerCLSID}
(Default) = {DescriptiveFilterHandlerName}
InprocServer32
(Default) = DLL Install Path
ThreadingModel = Both
註冊篩選處理常式的過時方法
不建議使用此方法。 篩選可以註冊代表元件物件模型 (COM) 類別的 CLSID,以及/或副檔名。 如果您需要為類別註冊篩選處理常式,以及類別內副檔名的不同篩選處理常式,您可以註冊這兩個篩選。 請注意,針對副檔名註冊的篩選處理常式優先于 CLSID 的篩選處理常式。
這些專案是標準 OLE 登錄專案,最多包含 CLSID\{ApplicationGUID}類別的專案。 DLL sample.dll會實作.txt類別的執行中物件行為。 請注意額外的專案 PersistentHandler。 此專案會指定類別,負責將要求代理至範例類別的永續性物件。 PersistentAddinsRegistered底下的專案會識別負責89BCB740-6119-101A-BCB7-00DD010655AF (IID_IFilter) 的實作。 實作 IID_IFilter 的類別具有標準的 OLE 登錄專案。 InprocServer32 DLL 會透過標準 OLE 機制載入。
Windows 搜尋會觀察為篩選處理常式指定的執行緒模型。 當執行緒模型設定為 [兩者]時,篩選處理常式必須是安全線程;否則,如果不是安全線程,請指定 Apartment。 請注意,篩選處理常式應一律為安全線程。
下列範例登錄專案適用于針對類別和副檔名註冊的篩選處理常式。 {PersistentHandlerGUID} 和 {FilterHandlerCLSID} 是用來做為變數,指出篩選處理常式建立者必須指定的值。 這些值的類型為 REG_SZ。
HKEY_LOCAL_MACHINE
Software
Classes
.txt
(Default) = SampleFile
SampleFile
(Default) = Class for Sample Files
CLSID
(Default) = {ApplicationGUID}
CLSID
{ApplicationGUID}
(Default) = Sample Files
InprocServer32
(Default) = sample.dll
PersistentHandler
(Default) = {PersistentHandlerGUID}
{PersistentHandlerGUID}
(Default) = Sample file persistent handler
PersistentAddinsRegistered
{89BCB740-6119-101A-BCB7-00DD010655AF}l
(Default) = {FilterHandlerCLSID}
{FilterHandlerCLSID}
(Default) = Sample Files
InprocServer32
(Default) = sampfilt.dll
ThreadingModel = Both
取代現有的篩選處理常式
建議您不要取代一般檔案類型的內建篩選處理常式,例如.txt、.doc、.html、.url 等等,因為這樣做可能會對其他系統元件造成不想要的影響。 例如,編制電子郵件訊息本文的索引取決於.txt、.html和 .rtf 篩選處理常式。
如果正在安裝檔案類型的新篩選處理常式做為現有篩選註冊的取代專案,安裝程式應該儲存目前的註冊,並在卸載新的篩選處理常式時還原它。 沒有鏈結篩選的機制。 因此,新的篩選處理常式會負責複寫舊篩選器的任何必要功能。
尋找指定副檔名的篩選處理常式
您可以使用 ILoadFilter 介面來尋找指定副檔名的篩選處理常式。 下列範例登錄專案說明如何針對 HTML 檔案執行這項操作。 在此範例中,HTML 檔案的篩選處理常式nlhtml.dll。 這些值的類型為 REG_SZ。
若要尋找指定副檔名的篩選處理常式:
- 檢查篩選檔案類型的副檔名是否已在登錄專案 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes.extension下註冊持續性處理常式。 如果是,請讓此機碼成為 {PersistentHandlerGUID}。
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{PersistentHandlerGUID}
- 如果沒有註冊延伸模組的持續性處理常式,請在登錄專案 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes下尋找與檔案類型相關聯的 CLSID。 讓此金鑰成為 {ApplicationGUID}。 然後判斷是否已為 CLSID 註冊持續性處理常式:使用 {ApplicationGUID} 找出 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{ApplicationGUID} 專案的持續性處理常式。 讓此機碼成為 {PersistentHandlerGUID}。
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
(Default) = Class for WWW HTML files
CLSID
(Default) = {25336920-03F9-11CF-8FD0-00AA00686F13}
CLSID
{25336920-03F9-11CF-8FD0-00AA00686F13}
PersistentHandler
(Default) = {PersistentHandlerGUID}
- 判斷持續性處理常式的 GUID:使用 {PersistentHandlerGUID} 尋找檔案類型的持續性處理常式 GUID。 登錄專案下的值HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{PersistentHandlerGUID}\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF 會產生此檔案類型的持續性處理常式 GUID。 讓此機碼成為 {FilterHandlerCLSID}。
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
{PersistentHandlerGUID}
(Default) = HTML File Persistent Handler<dl>
REG_SZ {89BCB740-6119-101A-BCB7-00DD010655AF}
REG_SZ (Default) = {EEC97550-47A9-11CF-B952-00AA0051FE20}
- 判斷篩選處理常式:使用在上一個步驟中決定的 {FilterHandlerCLSID},找出專案 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{FilterHandlerCLSID}\InprocServer32底下的篩選處理常式。 在此範例中,所使用的描述性篩選處理常式名稱是 HTML IFilter。
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
CLSID
{EEC97550-47A9-11CF-B952-00AA0051FE20}
(Default) = HTML IFilter
Data type REG_SZ
InprocServer32
nlhtml.dll
其他資源
- GitHub上提供的IFilterSample程式碼範例示範如何建立IFilter基類來實作IFilter介面。
- 如需編制索引程式的概觀,請參閱 編制索引進程。
- 如需檔案類型的概觀,請參閱 檔案類型。
- 若要查詢檔案類型的檔案關聯屬性,請參閱 PerceivedTypes、SystemFileAssociations 和應用程式註冊。