開発プラットフォームとしての Windows Search
新しいファイル形式とデータ ストアの内容とプロパティにインデックスを付けるには、Microsoft Windows Searchをアドインで拡張する必要があります。
新しいファイル形式とデータ ストアのサード パーティの開発者が、これらの形式とストアを Windows エクスプローラーのクエリ結果に表示するには、次の 3 つの操作を行う必要があります。
- シェルの名前空間を拡張するシェル データソースを実装します。
- データ ストア内の項目を公開します (インデックスを作成する必要があるため、新しいデータ ストアを追加する場合)。
- Windows Search がインデックス作成のためにデータにアクセスできるように、プロトコル ハンドラーを開発します。
このトピックは次のように構成されています。
作業の開始
Windows Search アプリケーションの作成を開始する前に、シェル データ ソースを使用することをお勧めします。 シェル データソースは、シェル名前空間を拡張し、データ ストア内の項目を公開します。 その後、データ ストア内の項目は、プロトコル ハンドラーを使用して Windows Search システムによってインデックスを作成できます。 シェル データソースを実装して Windows Search にアクセスする場合は、シェルの全機能にアクセスできるため、この間接的な方法をお勧めします。 このようにすることで、妥当なユーザー エクスペリエンスが保証されます。
クエリ結果を Windows エクスプローラーに表示させたい場合は、インデックスを拡張するプロトコル ハンドラーを作成する前に、シェル データ ソースを実装する必要があります。 ただし、すべてのクエリがプログラム (OLE DB など) で、シェルではなくアプリケーションのコードによって解釈される場合は、シェルの名前空間が引き続き推奨されますが、必須ではありません。
プロトコル ハンドラーは、Windows がデータベース内の項目やカスタム ファイルの種類など、ファイルの内容に関する知識を取得するために必要です。 Windows Search ではファイルの名前とプロパティにインデックスを付けることができますが、Windows ではファイルの内容を認識できません。 その結果、このような項目のインデックスを作成したり、Windows シェルで公開したりすることはできません。 カスタム プロトコル ハンドラーを実装すると、これらの項目を公開できます。 実現しようとしている開発者シナリオで識別されるハンドラーの一覧については、「ハンドラーの概要」 を参照してください。
検索開発シナリオの概要
Windows Search の最も一般的な開発シナリオは次のとおりです。
新しいデータ ストアの追加
インデックスを作成する新しいデータ ストアを追加する場合にのみ、Windows Search 用のシェル データストアが必要です。 データ ストアは、シェル データソースを使用してコンテナーとしてシェルプログラミング モデルに公開できるデータのリポジトリです。 その後、データ ストア内の項目は、プロトコル ハンドラーを使用して Windows Search システムによってインデックスを作成できます。 プロトコル ハンドラーは、コンテンツ ソースにネイティブ形式でアクセスするためのプロトコルを実装します。 ISearchProtocol インターフェイスと ISearchProtocol2 インターフェイスは、カスタム プロトコル ハンドラーを実装して、インデックスを作成できるデータ ソースを拡張するために使用されます。 シェル データ ソースの作成の詳細については、「基本的なフォルダー オブジェクト インターフェイスの実装」を参照してください。
新しいファイル形式の追加
新しいカスタム ファイル形式を追加する場合は、フィルター ハンドラーまたはプロパティ ハンドラーを開発する必要がありますが、両方を開発する必要はありません。 フィルターは、IFilter インターフェイスの実装です。 特定の種類のファイルを開き、インデクサーのプロパティとテキストの塊をフィルター処理します。 フィルターは、ファイル名拡張子、MIME の種類、またはクラス識別子 (CLSID) で示されるファイルの種類に関連付けられます。 1 つのフィルターで複数の種類のファイルを処理できますが、各ファイルの種類は 1 つのフィルターでのみ機能します。
プロパティ ハンドラーは、ファイルに格納されているデータを、Windows エクスプローラー、Windows Search、およびその他のアプリケーションによって認識され、アクセスできる構造化スキーマに変換します。 これらのシステムは、プロパティ ハンドラーと対話して、ファイルとの間でプロパティを書き込み、読み取ることができます。 変換されたデータには、詳細ビュー、ヒント、詳細ウィンドウ、プロパティ ページなどが含まれます。 各プロパティ ハンドラーは、ファイル名拡張子で識別される特定のファイルの種類に関連付けられます。 次の操作を行うには、プロパティ ハンドラーが必要です。
- インデックスのない項目のプロパティを UI に表示します。
- プロパティの書き込みをサポートします。
Windows 検索結果の使用
次のセクションでは、Windows 検索結果を使用するいくつかの方法について説明します。
- データのクエリ
- リモート データ ストアのクエリ (フェデレーション検索)
- ファイルとアイテムのインデックス作成
- データ ストアのインデックス作成
- インデックス作成プロセスの管理
- Windows プロパティ システムと Windows Search アプリケーションの統合
データのクエリ
Windows 検索と Windows プロパティ システムを組み合わせた上でアプリケーションを作成する開発者は、アプリケーションやファイルの種類に関係なく、ファイルやアイテムにアクセスできます。 アプリケーションがインデクサー データにアクセスするには、次の 2 つの方法があります。
- アプリケーションは、Windows Search 構造化照会言語 (SQL) クエリを Windows Search OLE DB プロバイダーに送信して結果を取得することで、OLE DB と直接通信します。 クエリは、手動で作成するか、ISearchQueryHelper インターフェイスを使用して検索キーワードから SQL を生成し、高度なクエリ構文 (AQS) を使用して作成できます。
- アプリケーションは シェル レイヤーを介して動作します。 シェル レイヤーの利点は、grep などの他のソースもサポートしていることです。 ただし、欠点は、すべてのインデクサー機能が使用できるわけではないという点です。
もう 1 つのオプションは、Windows エクスプローラーでレンダリングされた URL ベースの検索を実行する search-ms:// プロトコルと search:// プロトコルを使用することです。 このオプションを使用すると、最も軽量な開発が可能になりますが、結果ビューからの結果やユーザーの選択は呼び出し元アプリケーションに返されません。 また、他のプロトコルと同様に、サードパーティの検索アプリケーションは、アプリケーションが必要な機能セットに準拠している場合、search-ms:// プロトコルと search:// プロトコルを引き継ぐ可能性があります。 クエリの詳細については、「Windows Search でのプロセスの照会 およびプログラムによるインデックスのクエリ」を参照してください。
リモート データ ストアのクエリ (フェデレーション検索)
Windows 7 以降では、フェデレーション検索では、web サーバー、OpenSearch プロトコルを介してリモート データ ストアにクエリを実行し、RSS または Atom XML フィードとして結果を列挙する新しい検索プロバイダーが提供されます。 検索コネクタは、検索プロバイダーを使用してフォルダーの動作をシミュレートする名前空間ジャンクションです。 Windows 7 のリモート データ ストアへのフェデレーション検索の詳細については、「Windows でのフェデレーション検索」を参照してください。
ファイルとアイテムのインデックス作成
インデックスが作成されるコンテンツは、Windows Search に含まれるアドインでサポートされるファイルとデータの種類、およびファイル システム内のフォルダーの既定の包含規則と除外規則に基づいています。 たとえば、Windows Search に含まれるフィルターは、Microsoft Office ドキュメント、Microsoft Outlook 電子メール (MAPI プロトコル ハンドラーと組み合わせて)、プレーンテキスト ファイル、HTML など、200 種類を超える一般的なデータをサポートしています。 ネイティブでサポートされるファイルの種類の全一覧については、「インデックスに含まれる内容」を参照してください。
インデックスは、プロパティ ハンドラーとフィルターを使用して拡張し、新しいファイル形式のコンテンツとプロパティをインデックスと Windows エクスプローラーに公開できます。 フィルターは、IFilter インターフェイスの実装です。 フィルターには、ファイルなどの個々のアイテムと対話するフィルターと、フォルダーなどのコンテナーと対話するフィルターの 2 種類があります。 フィルターは、チャンク データ、テキスト コンテンツ、一部のプロパティ、および複数の言語をサポートするという点で多目的です。
これに対し、プロパティ ハンドラーには、ファイル名拡張子によって識別される特定のファイルの種類のプロパティを公開するという、より具体的な目的があります。 ファイルの種類のプロパティ ハンドラーは、プロパティの取得と設定を有効にでき、そのファイルの種類に関連付けられているプロパティを列挙できます。 フィルターとは異なり、プロパティ ハンドラーはデータやテキスト コンテンツのチャックをサポートしていません。プロパティ ハンドラーは、プロパティの書き込みをサポートしない限り、テキスト プロパティが含まれる言語を示す方法はありません。
データ ストアのインデックス作成
独自のデータ ストアへのアクセスを提供するために、プロトコル ハンドラーを使用してインデックスを拡張できます。 たとえば、ファイル システム以外のデータ ストア (データベースや電子メール ストアなど) に含まれるファイルとアイテムでは、URL からストリームにマップするプロトコル ハンドラーが必要です。 プロトコル ハンドラーは、ストリームから情報を抽出するために使用する適切なフィルターを必要に応じて決定することもできます。 フィルターは、データ ストアの URL を列挙します。 その後、適切なフィルターやプロパティ ハンドラーを使用して、アイテムのインデックスが個別に作成されます。 詳細については、「インデックスの拡張」を参照してください。
インデックス作成プロセスの管理
アプリケーション開発者は、さまざまな管理インターフェイスを使用して、Windows Search インデックス作成の範囲と頻度を制御できます。 これらのインターフェイスには、インデクサーが変更をスキャンするディレクトリを追加および削除する機能、データに対する変更のインデックスへの手動通知、インデクサーの状態の確認、一部またはすべてのデータのインデックス再作成を強制する機能が含まれます。 詳細については、「インデックスの管理」を参照してください。
Windows プロパティ システムと Windows Search アプリケーションの統合
Windows プロパティ システムは、シェル アイテムに関するメタデータを一様に表現する方法を提供する、データ定義の拡張可能な読み取り/書き込みシステムです。 Windows Vista 以降の Windows プロパティ システムを使用すると、シェル アイテムのメタデータを格納および取得できます。 シェル アイテムは、ファイル、フォルダー、電子メール、連絡先など、任意の 1 つのコンテンツです。 プロパティは、シェル アイテムに関連付けられた個々のメタデータです。 プロパティ値は、PROPVARIANT 構造体として表されます。
写真、音楽、ドキュメント、メッセージ、連絡先、ファイルなどの一般的なアイテムの種類には、共通プロパティの広範な一覧が含まれています。 また、既存のプロパティがニーズを満たしていない場合は、開発者が独自のプロパティをプラットフォームに導入することもできます。 アプリケーションと Windows プロパティ システムの統合の詳細については、「プロパティ ハンドラーの開発」を参照してください。
ハンドラーの概要
ハンドラーは、シェル アイテムに機能を提供するコンポーネント オブジェクト モデル (COM) オブジェクトです。 ほとんどのシェル データソースは、ハンドラーをアイテムにバインドするための拡張可能なシステムを提供します。 たとえば、ファイル システム フォルダーでは、関連付けシステムを使用して、特定のファイルの種類のハンドラーを検索します。 ファイルの種類ごとに特定のハンドラーが必要です。 Adobe Acrobat .pdf ファイルの種類には 1 つのフィルター ハンドラーが必要です。たとえば、.doc ファイル形式には別のフィルター ハンドラーが必要です。
異なるハンドラーには、いくつかの共通点があります。 Windows Vista 以降では、すべてのハンドラーで次のいずれかのインターフェイスを使用してハンドラーを初期化する必要があります。 IInitializeWithStream、 IInitializeWithItem、または IItinitializeWithFile。
次の表に、各タスクに必要なハンドラーの種類である高度な開発者タスクを示し、各タスクの実行方法に関する概念情報へのリンクを示します。
タスク | Handler | 概念に関する情報 |
---|---|---|
インデックス作成のためにファイルのプロパティにアクセスする | プロパティ ハンドラー (RDS) | プロパティ ハンドラーの開発 カスタム ファイル形式のシステム定義プロパティ |
アイテムのデータ オブジェクト (IDataObject) のクリップボード形式を追加する (データ オブジェクトはドラッグ アンド ドロップおよびコピー/貼り付けのシナリオで使用されます)。 | データ オブジェクト ハンドラー | データ ハンドラーの作成 |
ショートカット メニューに一般的に表示されるアイテムの動詞を追加する | ショートカット メニュー ハンドラー | コンテキスト メニュー ハンドラーの作成 動的動詞を使用したショートカット メニューのカスタマイズ |
ファイルの種類と特定のアイコンの関連付け | アイコン ハンドラー | アイコン ハンドラーの作成 |
ファイルの種類とのカスタム操作を可能にする UI 画像とコントロールを含むプロパティ シートを作成する | プロパティ シート ハンドラー | プロパティ シート ハンドラー |
ドラッグ アンド ドロップとコピー/貼り付けのシナリオをサポートするアイテムの種類を有効にする | ドロップ ハンドラー | 「ドラッグ アンド ドロップとクリップボードを使用したシェル オブジェクトの転送」を参照してください。 |
インデックス作成のためのテキストおよびドキュメント プロパティのチャンクの抽出 | フィルター ハンドラー | フィルター ハンドラーの開発 |
新しい種類のファイルのインデックス作成 | フィルター ハンドラー、プロパティ ハンドラー | フィルター ハンドラーの開発 プロパティ ハンドラーの開発 |
データ ストアのコンテンツのインデックス作成 | プロトコル ハンドラー | プロトコル ハンドラーの開発 |
Windows エクスプローラーのプレビュー ウィンドウでのシェル アイテムの簡略化されたビューのプレビュー | プレビュー ハンドラー | プレビュー ハンドラー |
マウスのカーソルが UI オブジェクト上に置かれたときにポップアップ テキストを指定する | ヒント ハンドラー | シェル拡張ハンドラーの作成 (ヒントのカスタマイズ) |
シェル アイテムを表す静的イメージの指定 | サムネイル ハンドラー | サムネイル ハンドラー |
次の表に、ハンドラーと、各種類のハンドラーを実装するためのインターフェイスを示します。
Handler | インターフェイス |
---|---|
ドロップ ハンドラー | IDropTarget、 IDropTargetHelper、 IPersistFile、 IShellExtInit |
データ オブジェクト ハンドラー | IDataObject、 IPersistFile |
フィルター ハンドラー | IFilter |
アイコン ハンドラー | IExtractIcon オプション: IPersist、 IPersistFile |
ヒント ハンドラー | IQueryInfo |
プレビュー ハンドラー | IPreviewHandler |
プロパティ ハンドラー (RDS) | IPropertyStore |
プロトコル ハンドラー | IFilter、 ISearchProtocol、 IUrlAccessor 省略可能: ISearchProtocol2、 IUrlAccessor2、 IUrlAccessor3、 IUrlAccessor4 |
プロパティ シート ハンドラー | IShellExtInit、 IShellPropSheetExt |
ショートカット メニュー ハンドラー | IContextMenu、 IExplorerCommand、 IShellExtInit |
サムネイル ハンドラー | IThumbnailProvider |
Note
プロパティ ハンドラーは、メタデータ ハンドラーとして知られている場合があります。 シェル データ ソースは、シェル名前空間拡張機能と呼ばれることもあります。 ファイルの種類のハンドラーは、シェル拡張ハンドラーまたはシェル拡張機能と呼ばれることもあります。
ハンドラーの作成の詳細については、「Shell 拡張ハンドラーの作成」を参照してください。 プロパティの詳細については、「Windows プロパティ システム」をご覧ください。
アドイン インストーラーのガイドライン
アドイン インストーラーを作成するときは、次のガイドラインに従います。
- インストーラーは、EXE インストーラーまたは MSI インストーラーを使用する必要があります。
- リリース ノートを指定する必要があります。
- [プログラムの追加と削除] エントリは、インストールされているアドインごとに作成する必要があります。
- インストーラーは、特定のファイルの種類または現在のアドインで認識されるストアのすべてのレジストリ設定を引き継ぐ必要があります。
- 以前のアドインが上書きされている場合、インストーラーはユーザーに通知する必要があります。
- 新しいアドインが以前のアドインを上書きした場合、ユーザーは以前のアドインの機能を復元し、そのファイルの種類またはストアの既定のアドインに再度設定できる必要があります。
注意 (実装者)
フィルターまたはプロパティ ハンドラーを作成する前に、開発者は次のことを考慮する必要があります。
- これらのハンドラーは、フィルター デーモン プロセス、Windows エクスプローラー (grep 検索)、Windows メールなどのサード パーティのホストなど、制御しないプロセスに読み込まれるインプロセス拡張機能です。
- システムを攻撃するために作成されたファイル形式の任意の破損形式を処理するために、十分な堅牢なセキュリティで保護されたコードを記述する必要があります。
- アドインは、ホスト プロセスの問題を発生させるリソースをリークしないようにする必要があります。
- アドインは、ホスト プロセスもクラッシュし、フィルター処理の速度が低下するため、クラッシュしないようにする必要があります。
- これらのハンドラーは、バックグラウンド システム プロセスで実行されるため、システムのパフォーマンス要件を満たすために使用される CPU と I/O を最小限に抑えて迅速に実行する必要があります。
したがって、これらのアドインは、システム レベルのコードの作成に関する専門知識を持つ開発者が記述する必要があります。
その他のリソース
- シェル データ ソースの作成の詳細については、「基本的なフォルダー オブジェクト インターフェイスの実装」を参照してください。
- シェルの既定のシステム フォルダー ビュー オブジェクト (DefView) を使用する必要があるデータ ソースについては、フォルダー ビューの実装、SHCreateShellFolderView 関数、および SFV_CREATE 構造体を参照してください。 シェルの既定のシステム フォルダー ビュー オブジェクト (DefView) を使用するデータ ソースは、インターフェイスのセットを実装する必要があります: IShellFolder、 IShellFolder2、 IPersistFolder、 IPersistFolder2、および (必要に応じて) IPersistFolder3。 IShellFolder 実装で DefView の作成に SHCreateShellFolderView を使用しない場合、シェル ビュー オブジェクトに IFolderView が必要になる場合があります。
- ISearchFolderItemFactory は、DBFolder と呼ばれるシェル データ ソースのコンシューマー向けのプライマリ インターフェイスです。 DBFolderの詳細については、Bind Context String Keys の STR_PARSE_WITH_PROPERTIES 定数の説明を参照してください。 「関連付け配列」と「IPropertySystem::GetPropertyDescriptionListFromString」も参照してください。
- OLE DB の詳細については、OLE DB プログラミングの概要に関するページを参照してください。 .NET Framework Data Provider for OLE DB の詳細については、System.Data.OleDb 名前空間のドキュメントを参照してください。
- 検索テクノロジに関するコミュニティでサポートされているメッセージ ボードについては、「Windows: 検索フォーラム」を参照してください 。
- 関連するコード サンプルについては、「Windows Search のコード サンプル」を参照してください。
関連トピック