フィルター ハンドラーを登録する必要があります。 レジストリまたは ILoadFilter インターフェイスを使用して、特定のファイル名拡張子の既存のフィルター ハンドラーを見つけることもできます。
このトピックは次のように構成されています。
注
フィルター ハンドラーは、 IFilter インターフェイスの実装です。
Windows Search のフィルター ハンドラーの登録
新しいプロトコル ハンドラーの登録または既存のプロトコル ハンドラーの検索に必要な GUID を次の表に示します。
| GUID | ユーザーまたはアプリケーションの定義 | Description |
|---|---|---|
| 89BCB740-6119-101A-BCB7-00DD010655AF | アプリケーション | 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 に設定されている場合、フィルター ハンドラーはスレッド セーフである必要があります。それ以外の場合は、スレッド セーフでない場合は、 アパートメントを指定します。 フィルター ハンドラーは常にスレッド セーフである必要があることに注意してください。
次のレジストリ エントリの例は、クラスおよびファイル名拡張子に登録されたフィルター ハンドラー用です。 {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 でフィルター ハンドラーを作成するためのベスト プラクティス