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

IFilter インターフェイスの実装であるフィルター ハンドラーは、ドキュメントでテキストとプロパティをスキャンします。 フィルター ハンドラーは、これらの項目からテキストのチャンクを抽出し、埋め込み書式を除外し、テキストの位置に関する情報を保持します。 ドキュメント プロパティに該当する値のチャンクも抽出されます。 IFilter は、ドキュメント インデクサーやアプリケーションに依存しないビューアーなど、より高度なアプリケーションを構築するための基盤です。

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

IFilter インターフェイスについて

Microsoft Windows Search では、フィルターを使用して、フルテキスト インデックスに含めるための項目の内容を抽出します。 Windows Search を拡張して、コンテンツを抽出するフィルターと、ファイルのプロパティを抽出するプロパティ ハンドラーを記述することで、新しいファイルの種類または独自のファイルの種類にインデックスを付けることができます。

IFilter インターフェイスは、フルテキスト検索エンジンの特定のニーズを満たすように設計されています。 Windows Search などのフルテキスト検索エンジンは 、IFilter メソッドを呼び出してテキストとプロパティ情報を抽出し、インデックスに追加します。 Windows Search では、返された IFilter::GetText メソッドの結果が単語に分割され、正規化され、インデックスに保存されます。 使用可能な場合、検索エンジンはテキスト チャンクの言語コード識別子 (LCID) を使用して、言語固有の単語区切りと正規化を実行します。

Windows Search では、次の表で説明する 3 つの関数を使用して、登録済みのフィルター ハンドラー ( IFilter インターフェイスの実装) にアクセスします。 これらの関数は、埋め込みオブジェクトのフィルター ハンドラーを読み込んでバインドする場合に特に便利です。

機能 Description
LoadIFilter 指定したコンテンツ タイプに最適な IFilter へのポインターを取得します。
BindIFilterFromStorage (バインドIFilterFromStorage - ストレージからIFilterをバインドする) IStorage Interface オブジェクトに含まれるコンテンツに最適な IFilter へのポインターを取得します。
BindIFilterFromStream ストリーム変数から取得した指定したクラス識別子 (CLSID) に最適な IFilter へのポインターを取得します。

IFilter インターフェイスには、次の表で説明する 5 つのメソッドがあります。

メソッド Description
IFilter::Init フィルター 処理セッションを初期化します。
IFilter::GetChunk 最初または次のチャンクの先頭に IFilter を配置し、記述子を返します。
IFilter::GetText 現在のチャンクからテキストを取得します。
IFilter::GetValue 現在のチャンクから値を取得します。
IFilter::BindRegion オブジェクトの指定した部分を表すインターフェイスを取得します。 将来の使用のために予約済み。

分離プロセス

Windows Search は、制限付き権限を持つローカル システム セキュリティ コンテキストで IFilter を実行します。 この IFilter ホスト分離プロセスでは、いくつかの権限が削除されます。

  • 制限付きコード
  • Everyone
  • ローカル
  • インタラクティブ
  • 認証済みユーザー
  • 組み込みユーザー
  • ユーザーのセキュリティ識別子 (SID)

これらの権限を削除すると、 IFilter インターフェイスは、ディスク システムまたはネットワーク、またはユーザー インターフェイスまたはクリップボード関数にアクセスできません。 さらに、分離プロセスは、子プロセスが作成されるのを防ぎ、ワーキング セットに 100 MB の制限を課すジョブ オブジェクトの下で実行されます。 IFilter インターフェイスのホスト分離プロセスでは、誤ってサードパーティ製のフィルターが実装される可能性があるため、インデックス作成プラットフォームの安定性が向上します。

注

バッファーを管理し、正しくスタックするには、フィルター ハンドラーを記述する必要があります。 バッファー オーバーランから保護するには、すべての文字列コピーに明示的なチェックが必要です。 常に、バッファーの割り当てられたサイズを確認する必要があります。 常に、バッファーのサイズに対してデータのサイズをテストする必要があります。

IFilter dlls

IFilter DLL は IFilter インターフェイスを実装し、クライアントがファイルの種類、クラス、または認識される型からテキストとプロパティ値の情報を抽出できるようにします。 Windows Search フィルター処理 プロセスSearchFilterHost.exe 、項目のクラス、認識される型、または名前拡張子に登録されている IFilter にバインドされます。

IFilter 構造体

各 IFilter は、指定されたフィルター処理機能を提供するインプロセス コンポーネント オブジェクト モデル (COM) サーバーを実装する DLL ファイルです。 次の図は、一般的な IFilter DLL の全体的な構造を示しています。 より複雑な例では、複数の IFilter クラスを 実装できます。

一般的な ifilter dll の構造の図

ネイティブ コード

複数のアドインが実行されるプロセスで共通言語ランタイム (CLR) のバージョン管理の問題が発生する可能性があるため、フィルターはネイティブ コードで記述する必要があります。 Windows 7 以降では、マネージド コードで記述されたフィルターは明示的にブロックされます。

IFilter クラス識別子の検索

IFilter DLL のクラスは、PersistentHandler レジストリ キーの下に登録されます。 HTML ファイルの次の例は、HTML ドキュメントの IFilter DLL を検索する方法を示しています。 この例では、項目に関連付けられている IFilter を検索するためにシステムで使用されるロジックと同様のロジックに従います。

  1. DLL フィルターが適用されるファイルの種類の拡張子が、レジストリ エントリ \HKEY_LOCAL_MACHINE\SOFTWARE\Classesの下に PersistentHandler が登録されているかどうかを確認します。 このキーを Value1します。 そのエントリが既に存在する場合は、この手順の手順 4 に進み、そのキーで Value1 を使用します。 値はREG_SZ型です。
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. または、拡張機能に登録されている PersistentHandler がない場合は、レジストリ エントリ \HKEY_LOCAL_MACHINE\SOFTWARE\Classesで、ドキュメントの種類に関連付けられている CLSID を見つけます。 このキーを Value2します。
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. PersistentHandler が CLSID に登録されているかどうかを確認します。 手順 2 で決定した Value2 を使用して、\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 エントリの PersistentHandler を見つけます。 このキーを Value3します。
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. IFilter 永続的ハンドラー GUID を決定します。 Value1とValue3を使用して、ドキュメントの種類の IFilter 永続ハンドラー GUID を見つけます。 レジストリ エントリ \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 または 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> の値により、このドキュメントの種類の IFilter PersistentHandler GUID が生成されます。 このキーを Value4します。 この例では、 IFilter インターフェイス GUID は 89BCB740-6119-101A-BCB7-00DD010655AF です。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {EEC97550-47A9-11CF-B952-00AA0051FE20}
                 = HTML File Persistent Handler
                    Data type         REG_SZ
                        PersistentAddinsRegistered
                        {89BCB740-6119-101A-BCB7-00DD010655AF}

                    Data type         REG_SZ
                        default = {E0CA5340-4534-11CF-B952-00AA0051FE20}

注

この例では、HTML ドキュメント用 の IFilter DLL が nlhtml.dll。

IFilter::GetChunk とロケール コード識別子

テキストの LCID は、1 つのファイル内で変更できます。 たとえば、取扱説明書のテキストが英語 (en-us) とスペイン語 (es) の間で代替される場合や、テキストに第 1 言語以外の言語の 1 つの単語が含まれている場合があります。 どちらの場合も、LCID が変更されるたびに IFilter が新しいチャンクを開始する必要があります。 LCID は適切なワード ブレーカーを選択するために使用されるため、正しく識別することが非常に重要です。 IFilter がテキストのロケールを特定できない場合は、チャンクを含む 0 の LCID を返す必要があります。 LCID が 0 を返すと、Windows Search は言語自動検出 (LAD) テクノロジを使用してチャンクのロケール ID を決定します。 Windows Search で一致するものが見つからない場合、既定ではシステムの既定のロケールになります ( GetSystemDefaultLocaleName 関数関数 を呼び出します)。 詳細については、「 IFilter::GetChunk、 CHUNK_BREAKTYPE、 CHUNKSTATE、 および STAT_CHUNK」を参照してください。

ファイル形式を制御していて、現在ロケール情報が含まれていない場合は、適切なロケール識別を有効にするユーザー機能を追加する必要があります。 ワード ブレーカーの不一致を使用すると、ユーザーのクエリ エクスペリエンスが低下する可能性があります。 詳細については、「 IWordBreaker」を参照してください。

注

フィルターは、ファイル名拡張子、MIME の種類、または CLSID で示されているように、ファイルの種類に関連付けられます。 1 つのフィルターで複数のファイルの種類を処理できますが、各種類は 1 つのフィルターでのみ機能します。

その他のリソース

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

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

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

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

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

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

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