フィルター ハンドラーの登録
フィルター ハンドラーを登録する必要があります。 レジストリまたは ILoadFilter インターフェイスを使用して、特定のファイル名拡張子の既存のフィルター ハンドラーを見つけることもできます。
このトピックは次のように整理されています。
Note
フィルター ハンドラーは、 IFilter インターフェイスの実装です。
Windows 検索用のフィルター ハンドラーの登録
新しいプロトコル ハンドラーの登録または既存のプロトコル ハンドラーの検索に必要な GUID を次の表に示します。
GUID | ユーザーまたはアプリケーションの定義 | 説明 |
---|---|---|
89BCB740-6119-101A-BCB7-00DD010655AF | Application | IFilter インターフェイス GUID は、すべてのフィルター ハンドラーのレジストリ キー定数です。 |
{PersistentHandlerGUID} | User | これは永続的ハンドラーの GUID です。 |
{FilterHandlerCLSID} | User | これは、フィルター ハンドラーのクラス識別子 (CLSID) です。 |
{ApplicationGUID} | User | これは中間 (集計) GUID です。 |
SearchFilterHost.exeが SYSTEM アカウントで実行されているため、ログオンしているユーザーのHKEY_CURRENT_USERのレジストリ キーにアクセスできないため、フィルター ハンドラーをHKEY_LOCAL_MACHINEに登録する必要があります。 さらに、ユーザー グループは、フィルター ハンドラー.dllそれ自体に対する読み取りと実行のアクセス権を持っている必要があります。これは、SearchFilterHost.exeはすべての管理者権限を削除し、管理者権限以外の権限のみを許可するためです。 既定の Visual Studio プロジェクトの場所は現在のユーザーのディレクトリにあるため、Users グループに対する読み取りアクセス許可は付与されないため、.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 のフィルター ハンドラーよりも優先されることに注意してください。
これらのエントリは、 CLSID\{ApplicationGUID} クラスのエントリまでの標準 OLE レジストリ エントリです。 DLL sample.dllは、.txt クラスの実行中のオブジェクト動作を実装します。 追加のエントリ PersistentHandler をメモします。 このエントリは、サンプル クラスの永続オブジェクトへの要求を仲介するクラスを指定します。 PersistentAddinsRegistered の下のエントリは、89BCB740-6119-101A-BCB7-00DD010655AF(IID_IFilter) という名前のインターフェイスを担当する実装を識別します。 IID_IFilterを実装するクラスには、標準の OLE レジストリ エントリがあります。 InprocServer32 DLL は、標準の OLE メカニズムを介して読み込まれます。
Windows Search では、フィルター ハンドラーに対して指定されたスレッド モデルが観察されます。 スレッド モデルが Both に設定されている場合、フィルター ハンドラーはスレッド セーフである必要があります。それ以外の場合は、スレッド セーフでない場合は、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、およびアプリケーション登録」を参照してください。
関連トピック
Windows Search のフィルター ハンドラーについて
Windows Search でフィルター ハンドラーを作成するためのベスト プラクティス