IFilter アドインの開発
注意
Windows Desktop Search 2.x は、Windows XP および Windows Server 2003 のアドインとしてもともと使用されていた古いテクノロジです。 以降のリリースでは、代わりに Windows Search を使用してください。
フィルター アドイン ( IFilterインターフェイスを実装するコンポーネント) を使用して Microsoft Windows Desktop Search (WDS) を拡張し、新しいファイルの種類を含めることができます。 フィルターは、ファイル内のデータにアクセスして解析し、プロパティと値のペアとインデックス作成用のテキストのチャンクを返します。 インデックス作成プロセス中に、WDS は各ファイルまたはアイテムの URL を使用して適切なフィルターを呼び出します。 フィルターは、まず、タイトル、ファイル サイズ、最終変更日など、WDS スキーマで取得可能とマークされているプロパティに対応するメタデータを抽出します。 次に、アイテムの内容をテキストのチャンクに分割します。 WDS は、フィルターによって返されるプロパティとテキストをカタログに追加します。 WDS では、フィルターが登録されている任意のファイルの種類にインデックスを作成できます。
状況によっては、新しいフィルターを記述する必要はありません。 WDS 2.x には、200 種類を超えるアイテム (HTML、XML、ソース コード ファイルなどのプレーンテキスト項目を含む) のフィルターが含まれており、SharePoint Services と同じ IFilterテクノロジが使用されます。 ファイルの種類に対してフィルターが既にインストールされている場合、WDS では、これらの既存のフィルターを使用してこのデータのインデックスを作成できます。 さらに、WDS には、プレーンテキスト ベースのファイルの種類に対する一般的なフィルターが含まれています。 既存のSharePoint Services フィルターまたはプレーンテキスト フィルターで処理できるファイルの種類がある場合は、ファイル名拡張子とフィルター GUID をレジストリに追加して、WDS が見つけて使用できるようにします (詳細については、「フィルター アドインを登録するには」を参照してください)。
ただし、プレーンテキスト以外の独自のデータまたはファイル形式がある場合は、WDS がカタログ内のファイル形式にインデックスを作成できるようにする唯一の方法は、カスタム フィルターの実装を記述することです。 ファイルの種類に対してフィルター アドインを 1 つだけ使用できるため、既存のフィルターをオーバーライドしたり、特定のファイルの種類に対して別のフィルターをオーバーライドしたりできます。
このセクションのトピックは次のとおりです。
必要なフィルター インターフェイス
フィルター アドインは 、IFilterインターフェイスと次のいずれかのインターフェイスを実装する必要があります。
- IPersistStream - ストリームからデータを読み込みます。 これは、ディスクに何も書き込まれないため、ファイルを使用するよりも安全です。 IPersistStream インターフェイスは、Windows Vista との前方互換性のために推奨される方法です。
- IPersistFile インターフェイス - ファイルからデータを読み込みます。 このインターフェイスは、Windows Vista ではサポートされていません。
- IPersistStorage インターフェイス - OLE COM 構造化ストレージからデータを読み込みます。
フィルター アドインは、これらのインターフェイスを使用して項目の内容を取得し、ファイルの末尾に達するまでインデックスに繰り返し返します。 フィルター アドインは、破損したファイルと、想定される入力形式を満たしていないファイルを処理するために、可能な限り堅牢である必要があります。
IFilter インターフェイス
これは、フィルター実装に必要なインターフェイスです。 詳細については、 IFilterインターフェイスリファレンスを参照してください。
メソッド | 説明 |
---|---|
Init() | フィルター処理セッションを初期化します。 |
GetChunk() | 最初または次のチャンクの先頭にフィルターを配置し、記述子を返します。 |
GetText() | 現在のチャンクからテキストを取得します。 |
GetValue() | 現在のチャンクからプロパティ値を取得します。 |
BindRegion() | 現在、内部使用のために予約されています。は実装しません。 このメソッドは、E_NOTIMPLを返します。 |
IPersistStream
IPersistStream フィルターを実行するコンテキストには、ディスク上またはネットワーク経由でファイルを開く権限が必要ないため、このインターフェイスは IPersistFile インターフェイスよりも安全な処理のためにストリームからファイルを読み込みます。 1 つのファイルにアクセスするための 2 つの方法のうち、これは Windows との前方互換性のために推奨される方法です。
メソッド | 説明 |
---|---|
IsDirty() | 変更があったかどうかを確認します。 このメソッドは、フィルターでE_NOTIMPLを返します。 |
InitNew() | 新しいストレージを作成します。 このメソッドは、フィルターでE_NOTIMPLを返します。 |
Load() | オブジェクトが以前格納されたストリームから、そのオブジェクトを初期化します。 |
Save() | オブジェクトを指定されたストリームに保存し、オブジェクトがダーティ フラグをリセットする必要があるかどうかを示します。 このメソッドは、フィルターでE_NOTIMPLを返します。 |
GetSizeMax() | オブジェクトを保存するために必要なストリームのサイズをバイト単位で返します。 このメソッドは、フィルターでE_NOTIMPLを返します。 |
IPersistFile
このインターフェイスは絶対パスでファイルを読み込みますが、Windows Vista ではサポートされていません。
メソッド | 説明 |
---|---|
GetCurFile() | オブジェクトに関連付けられているファイルの現在の名前を取得します。 Load() で指定されたパスを返します。 |
Load() | 指定したファイルを開き、ファイルに含まれているオブジェクトを初期化します。 必要になるまでファイルを開くのを遅らせることができます。 |
GetClassID() | 新しいファイルの種類のクラス識別子 (CLSID) を返します。 uuidgen.exeを使用して一意の CLSID を生成する必要があります。 |
IsDirty() | フィルターでE_NOTIMPLのみを返す必要がある |
Save() | フィルターでE_NOTIMPLのみを返す必要がある |
SaveCompleted() | フィルターでE_NOTIMPLのみを返す必要がある |
IPersistStorage
このインターフェイスは、コンテナーのストレージ内に入れ子になった独自のストレージを各包含オブジェクトに持つ構造化ストレージ モデルをサポートします。 IPersistFile インターフェイスと同様に、このインターフェイスは絶対パスによって読み込まれますが、Windows Vista ではサポートされていません。
メソッド | 説明 |
---|---|
IsDirty() | 変更が行われたかどうかを確認します。 このメソッドは、フィルター内のE_NOTIMPLを返します。 |
InitNew() | 新しいストレージを作成します。 このメソッドは、フィルター内のE_NOTIMPLを返します。 |
Load() | ストレージを保存します。 このメソッドは、フィルター内のE_NOTIMPLを返します。 |
Save() | オブジェクトを保存するために必要なストリームのサイズをバイト単位で返します。 このメソッドは、フィルター内のE_NOTIMPLを返します。 |
SaveCompleted() | 内部使用のために予約されています。 このメソッドは、フィルター内のE_NOTIMPLを返します。 |
HandsOffStorage() | 内部使用のために予約されています。 このメソッドは、フィルター内のE_NOTIMPLを返します。 |
フィルターを使用したプロパティの出力
フィルターの目的は、フルテキスト インデックスに含めるためにファイルのコンテンツとプロパティを抽出することです。 WDS はまず、IPersistFile、IPersistStream、または IPersistStorage 実装で Load メソッドを呼び出し、IFilter 実装の Init メソッドを呼び出します。 GetChunk は、テキストまたはプロパティ値データのチャンクを取得するために呼び出され、チャンクに関連付けられているすべてのテキストまたはプロパティ値を取得するために、 GetText または GetValue が必要な回数だけ呼び出されます。 このプロセスは 、GetChunk がドキュメント内にチャンクがないことを報告するまで繰り返されます。
GetChunk メソッドは、フィルター処理されるファイルから情報の最初または次の論理ブロックに関する情報を取得し、単調に増加するチャンク ID、現在のチャンクと前のチャンクとの関係に関する状態情報、チャンクにテキストまたは値が含まれているかどうかを示すフラグなど、STAT_CHUNK構造でその情報を返します。 チャンクのロケール、およびチャンクのプロパティ仕様。 プロパティ仕様は、CLSID と整数または文字列プロパティ識別子 (D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType など) で構成される FULLPROPSPEC です。 プロパティ値自体ではなく、プロパティの型を識別します。
チャンク ロケール識別子は、適切なワード ブレーカーを選択するために使用され、正しく識別することが非常に重要です。 フィルターがテキストのロケールを特定できない場合は、 GetSystemDefaultLCID を使用して使用できる既定のシステム ロケールを想定する必要があります。 ファイル形式を制御していて、現在ロケール情報が含まれていない場合は、適切なロケール識別を有効にするユーザー機能を追加する必要があります。 ワード ブレーカーの不一致を使用すると、ユーザーのクエリ エクスペリエンスが低下する可能性があります。
GetChunk は チャンクへのアクセスのみを管理し、テキストまたはプロパティ値自体は返しません。 代わりに、 GetText と GetValue の後続の呼び出しでは、チャンクの本文が取得されます。 GetText は、現在のCHUNK_TEXTチャンクからテキスト チャンク (Unicode 文字列) を返します。 現在のチャンクが大きすぎる場合は、 GetText メソッドを複数呼び出す必要があります。 GetText メソッドを呼び出すたびに、GetText メソッドの最後の呼び出しからテキストの直後にあるテキストが取得されます。 たとえば、1 つの呼び出しの最後の文字を単語の途中にすることができ、次の呼び出しの最初の文字はその単語を続行します。 検索エンジンは、この状況を処理する必要があります。
GetValue は、PROPVARIANT 構造体内の現在のCHUNK_VALUE チャンクのプロパティ値を返します。これは、さまざまなデータ型を保持できます。 GetValue は、CoTaskMemAlloc を使用して PROPVARIANT 構造体自体を割り当てる必要があります。 GetValue の呼び出し元は、PropVariantClear を使用して PROPVARIANT が指すメモリを解放し、CoTaskMemFree を使用して構造体自体を解放します。 PROPVARIANT の詳細については、 PROPVARIANT リファレンスを参照してください。
プロパティ値
フィルターは、WDS 結果ビューの既定の列である次のプロパティを少なくとも出力する必要があります。
GUID | PROPSPEC | フレンドリ名 | Description |
---|---|---|---|
F29F85E0-4FF9-1068-AB91-08002B27B3D9 | 2 | PrimaryTitle | このアイテムに対して表示されるタイトル。 |
F29F85E0-4FF9-1068-AB91-08002B27B3D9 | 4 | PrimaryAuthors | このアイテムに最も関連付けられているユーザー。 |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | PrimaryDate | PrimaryDate | アイテムの最も重要な日付 (メールで受信した日付やファイルに対して変更された日付など)。 |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | PerceivedType | PerceivedType | 解析されるファイルの種類。 WDS 認識型に記載されている Windows デスクトップ検索の種類のいずれかに一致する必要があります。 |
プレーンテキスト項目の場合、WDS は、新しいプレーンテキスト ファイルの種類をインデックスに含める上で、ファイル サイズや拡張子など、すべてのテキストおよびシステム定義のプロパティを抽出します。 インデックスに返すことができるその他の種類のプロパティは次のとおりです。
- ファイルの場合: 作成者、タイトル、状態、キーワード
- メディアの場合: アルバム、ジャンル、カメラの作成、撮影日
- 通信の場合: from、to、cc、importance
- 連絡先の場合: 役職、勤務先電話、会社
上記の一覧では、指定された認識型に共通のプロパティがグループに含まれています。ただし、型に関係なく、任意のプロパティを使用できます。 たとえば、会社を連絡先の雇用主名に使用し、ファイルが関連するクライアントの名前を参照するために使用することもできます。 これらのプロパティの多くは、WDS 結果ビューに検索結果を表示するために使用されます。 たとえば、ファイルの Title プロパティは、既定の結果ビューのメイン列として表示されます。 IFilter オブジェクトは、解析するアイテムの種類に関連するすべてのプロパティを出力する必要があります。 WDS 2.x ではカスタム プロパティを追加できません。 使用可能なプロパティの完全な一覧については、「 WDS スキーマ」を参照してください。
アドインのインストールをフィルター処理する
フィルターをインストールするには、DLL を Program Files ディレクトリ内の適切な場所にコピーし、登録する必要があります。 フィルターは、インストール用に自己登録を実装する必要があり、次のガイドラインに従う必要があります。
- インストーラーでは、EXE インストーラーまたは MSI インストーラーを使用する必要があります。
- リリース ノートを提供する必要があります。
- インストールされているアドインごとに、 プログラムの追加と削除 のエントリを作成する必要があります。
- インストーラーは、現在のアドインが認識する特定のファイルの種類またはストアのすべてのレジストリ設定を引き継ぐ必要があります。
- 以前のアドインが上書きされている場合、インストーラーはユーザーに通知する必要があります。
- 新しいアドインが以前のアドインを上書きした場合は、以前のアドインの機能を復元し、そのファイルの種類またはストアの既定のアドインにし直す機能が必要です。
登録に必要な CLS ID
すべてのフィルターに関連付けられている 3 つのクラス識別子 (CLSID) があります。 フィルター アドインを登録するには、これらの 1 つ以上を生成する必要があります (uuidgen.exeを使用します)。
- 1 つ目は、すべてのフィルターの永続ハンドラー (IID_IFilter) を識別します。これは {89BCB740-6119-101A-BCB7-00DD010655AF} です。 この CLSID は、IFilter を実装するすべてのフィルターに対して定数です。
- 2 つ目の (IID_IFilter キーの値) は、ファイルの種類の IFilter 実装を識別します。 このキーには、パスとスレッド モデルで DLL 名を指定する InprocServer32 値が含まれています。 フィルターが system32 ディレクトリのようなシステム パスにある場合は、ファイル名で十分です。 それ以外の場合、この値には完全なパス指定が必要です。
- 3 つ目は、フィルター処理するファイルの種類を識別し、IPersist インターフェイスの GetClassID メソッドによって返されます。
注意
今後のバージョンの Microsoft オペレーティング システムでは、system32 ディレクトリへのファイルのインストールが困難になる可能性があるため、プログラム ファイルにインストールし、レジストリにフィルターへの完全パスを含めるようにすることをお勧めします。 セキュリティ上の理由から、レジストリで DLL への完全なパスを指定することも慎重です。 そうしないと、DLL の "トロイの木馬" バージョンが、バージョンより前のプロセス パスに存在する場合に読み込まれる可能性があります。
登録モデル
WDS は、ファイルをフィルター処理する準備ができたら、ファイルの拡張子の下にあるレジストリを調べて、読み込むフィルターを決定します。 その後、一連のレジストリ リンクに従って、フィルター DLL の名前を次の順序で検索します。
次の場所にある CLSID から:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters
次の場所にあるファイル コンテンツ タイプから:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type
ファイル名拡張子 (Win32 LoadIFilter API と同じ) から:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp
HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters
HKEY_CLASSES_ROOT\extpersistentHandler-CLSID-IID_IFilter-CLSID>>>
既定値から:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters
フィルター アドインを登録するには
フィルター アドインを登録するには、レジストリに合計 8 つのエントリを作成する必要があります。
- .ext は新しいファイル名拡張子です
- GUID_1 は、この拡張機能に対して生成された任意の新しい GUID にすることができます
- 89BCB740-6119-101A-BCB7-00DD010655AF は、すべての IFilter 実装の定数である IFilter インターフェイス GUID です。
ファイル名拡張子の永続ハンドラーを、次のキーと値で登録します。
HKEY_CLASSES_ROOT\<.ext>\PersistentHandler (Default) = {GUID_1}
HKEY_CLASSES_ROOT\CLSID\{GUID_1} (Default) = <Persistent Handler Description>
HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered (Default) = (Value Not Set)
HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF} (Default) = {CLSID of IFilter implementation}
HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler (Default) = {GUID_1}
次のキーと値を使用して IFilter 実装を登録します。
HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation} (Default) = Extension IFilter Description">
HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32 (Default) = <DLL Install Path> ThreadingModel = Both
次のキーと値を使用して、Windows デスクトップ検索に IFilter 実装を登録します。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext> (Default) = {CLSID of IFilter implementation}"
関連トピック
-
リファレンス
-
その他のリソース