次の方法で共有


Windows Search でのフィルター ハンドラーの実装

フィルター ハンドラーの必要な DLL 構造 ( IFilter インターフェイスの実装) を理解しておくことが重要です。

このトピックは次のように整理されています。

DLL エントリ ポイントの実装とエクスポート

IFilter DLL (このセクションのIfilter.dllで示されます) は、次のエントリ ポイントを実装してエクスポートする必要があります。 これらのエントリ ポイントは、通常、IFilter インターフェイスのモジュール定義 (.def) ファイルを使用するか、__declspec(dllexport) キーワード (keyword)を使用してエクスポートされます。 DLL ファイルは任意のフォルダーに登録できますが、通常は %SystemRoot%\system32 フォルダーに存在します。

DLL エントリ ポイントの一覧と説明を次の表に示します。

DLL 名 DLL の説明
DllRegisterServer DllRegisterServer エントリ ポイントは、DLL をフィルターとしてレジストリに登録します。 DLL を登録する場合は、 IFilter インターフェイス DLL ファイル名を引数として使用してregsvr32.exe プログラムを実行します。 regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer 関数 DllUnregisterServer 関数エントリ ポイントは、レジストリ内の永続的なハンドラーとして DLL を削除します。 フラグを使用してregsvr32.exe プログラムを実行して、DLL の登録を /u 解除します。 regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject 関数 コンテンツ インデックス 作成クライアントは、コンポーネント オブジェクト モデル (COM) を介して DllGetClassObject 関数 エントリ ポイントを呼び出して、 IFilter インターフェイスのクラス ファクトリ オブジェクトを作成し、そのオブジェクトのクラス ファクトリ インターフェイスへのポインターを取得します。
DllCanUnloadNow 関数 コンテンツ インデックス 作成クライアントは、COM を介して DllCanUnloadNow 関数 エントリ ポイントを呼び出して、 IFilter DLL をアンロードできるかどうかを判断します。 IFilter インターフェイスは、FilterIdleTimeOut レジストリ値で指定されているように、一定時間使用されていないとアンロードされます。

IFilter クラスとクラス ファクトリの実装

CFilter や CFilterCF などの少なくとも 2 つのクラスは、通常、各 IFilter DLL によって実装されます。 CFilter クラスは、コンテンツ フィルター機能を実装する IFilter インターフェイス オブジェクトを生成します。 そのメンバー関数は、 IFilter インターフェイスのインターフェイス メソッドを実装します。 各 IFilter クラスには、 IFilter インターフェイス 実装者が生成する一意のクラス識別子 (CLSID) が必要です。

CFilterCF クラスは、 IFilter インターフェイスのクラス ファクトリ オブジェクトを生成します。 クラス ファクトリは、 IClassFactory インターフェイス インターフェイス を介して、 DLL の DllGetClassObject 関数 エントリ ポイントによって呼び出されます。 CFilterCF クラスは CFilter オブジェクトを作成し、 IUnknown へのポインターを返します。 より複雑なケースでは、 IFilter は単一の CFilter クラスの代わりにクラス階層を実装できます。

COM インターフェイスの継承

Windows Search 3.0 以降では、次の理由で IPersistStream を使用する必要があります。

これらのインターフェイスは、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::InitIFilter::GetChunkIFilter::GetTextIFilter::GetValueIFilter::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 Search では、次の表に示す COM メソッドを実装する必要はありません。

不要なメソッド 説明
IPersistStream::IsDirty フィルターはE_NOTIMPLを返す必要があります。
IPersistStream::Save フィルターはE_NOTIMPLを返す必要があります。
IPersistStream::GetSizeMax フィルターはE_NOTIMPLを返す必要があります。
IFilter::BindRegion フィルターはE_NOTIMPLを返す必要があります。

その他のリソース

フィルター ハンドラーの開発

Windows Search のフィルター ハンドラーについて

Windows Search でフィルター ハンドラーを作成するためのベスト プラクティス

フィルター ハンドラーからプロパティを返す

Windows に付属するフィルター ハンドラー

フィルター ハンドラーの登録

フィルター ハンドラーのテスト