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

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

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

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

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

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

DLL 名 DLL の説明
DllRegisterServer DllRegisterServer エントリ ポイントは、DLL をフィルターとしてレジストリに登録します。 DLL を登録するには、 IFilter インターフェイス DLL ファイル名を引数として使用して regsvr32.exe プログラムを実行します。 regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer 関数 DllUnregisterServer 関数エントリ ポイントは、DLL をレジストリ内の永続的なハンドラーとして削除します。 /u フラグを使用して regsvr32.exe プログラムを実行して、DLL の登録を解除します。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 インターフェイスのクラス ファクトリ オブジェクトを生成します。 クラス ファクトリは、DLL の DllGetClassObject 関数エントリ ポイントによって、IClassFactory インターフェイス インターフェイスを介して呼び出されます。 CFilterCF クラスは、CFilter オブジェクトを作成し、 IUnknown へのポインターを返します。 より複雑なケースでは、 IFilter は単一の CFilter クラスの代わりにクラス階層を実装できます。

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

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

  • パフォーマンスと将来の互換性を確保するため。
  • セキュリティの強化に役立ちます。 IFilter インターフェイスを実行するコンテキストには、ディスク上またはネットワーク経由でファイルを開く権限が必要ないため、 IPersistStream で実装された IFilter の方が安全です。
  • Windows Search では IPersistStream のみが使用されますが、 IFilter インターフェイス クラスは、下位互換性のために IPersistFile インターフェイス および IPersistStorage インターフェイス の実装を継承することもできます。

これらのインターフェイスは、mssdk\include ディレクトリから含まれるファイルで宣言され、定義済みのインターフェイス識別子 (IID) を持ちます。 コンテンツ インデックス作成クライアントは、IUnknown を介して IFilter インターフェイスに対してクエリを実行し、コンテンツをフィルター処理するときに使用するインターフェイスを決定します。

COM インターフェイス メソッドの実装

IFilter インターフェイスは、IFilter インターフェイス クラスと IFilter インターフェイス クラス ファクトリの両方の IUnknown メソッドを実装します。 次の表に、 IFilter インターフェイス固有のインターフェイスと、 IFilter インターフェイスが実装する必要があるメソッドを vtable 順に示します。 IFilter インターフェイスは、少なくとも IPersistStream を実装する必要がありますが、追加の IPersist 派生インターフェイスを実装できます。

COM インターフェイス メソッド
IClassFactory インターフェイス CreateInstance、LockServer
IClassFactory2 インターフェイス GetLicInfo、RequestLicKey、CreateInstanceLic
IFilter IFilter::Init、 IFilter::GetChunk、 IFilter::GetText、 IFilter::GetValue、 IFilter::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 メソッドを実装する必要はありません。

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

その他のリソース

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

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

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

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

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

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

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