フィルター ハンドラーの必要な DLL 構造 ( IFilter インターフェイスの実装) を理解しておくことが重要です。
このトピックは次のように構成されています。
- DLL エントリ ポイントの実装とエクスポート
- IFilter クラスとクラス ファクトリの実装
- COM インターフェイスの継承
- COM インターフェイス メソッドの実装
- その他のリソース
- 関連トピック
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を返す必要があります。 |
その他のリソース
- GitHub で入手できる IFilterSample コード サンプルでは、IFilter インターフェイスを実装するための IFilter 基本クラスを作成する方法を示します。
- インデックス作成プロセスの概要については、「 インデックス作成プロセス」を参照してください。
- ファイルの種類の概要については、「ファイルの種類 」を参照してください。
- ファイルの種類のファイル関連付け属性を照会するには、「 PerceivedTypes、SystemFileAssociations、およびアプリケーションの登録」を参照してください。
関連トピック
Windows Search のフィルター ハンドラーについて