手記
Windows Desktop Search 2.x は、Windows XP および Windows Server 2003 のアドインとして最初に利用できた古いテクノロジです。 以降のリリースでは、代わりに Windows Search 使用してください。
プロトコル ハンドラーの作成には、ISearchProtocol を実装して UrlAccessor オブジェクトを管理したり、IUrlAccessorをしてメタデータを生成したり、データ ストア内の項目に対する適切なフィルターを識別したり、IProtocolHandlerSite を使用して SearchProtocol オブジェクトをインスタンス化して適切なフィルターを識別したり、IFilterをして独自のファイルをフィルター処理したり、階層的に保存されたファイルを列挙およびフィルター処理したりする必要があります。 プロトコル ハンドラーはマルチスレッドである必要があります。
このセクションには、次のトピックが含まれています。
URL に関する注意
Microsoft Windows Desktop Search (WDS) は、URL を使用して、ファイル システム、データベースに似たストア内、または Web 上の項目を一意に識別します。 エントリ ノードを定義する URL は、スタート ページと呼ばれます。WDS はその開始ページから開始し、データ ストアを再帰的にクロールします。 一般的な URL 構造は次のとおりです。
protocol://host/path/name.extension
手記
新しいデータ ストアを追加する場合は、名前を選択して、現在のデータ ストアと競合しない名前を識別する必要があります。 companyName.scheme という名前付け規則をお勧めします。
プロトコル ハンドラー インターフェイス
ISearchProtocol
ISearchProtocol インターフェイスは、UrlAccessor オブジェクトの呼び出し、初期化、および管理を行います。 ISearchProtocol インターフェイスの実装の詳細については、「ISearchProtocol インターフェイス リファレンスを参照してください。
IUrlAccessor
指定した URL の場合、IUrlAccessor インターフェイスは、場所の構造に関するメタデータと含まれている項目を生成し、それらの項目をフィルターにバインドします。 IUrlAccessor オブジェクトは、SearchProtocol オブジェクトによってインスタンス化および初期化されます。ただし、IUrlAccessor オブジェクトがプロトコル ハンドラーに固有の初期化タスクを実行できるように、内部初期化メソッドを実装することもできます。たとえば、アクセスされるアイテムの URL の検証や、現在のクロールでファイルを処理する必要があるかどうかを判断するための最終変更時刻の確認などです。
手記
ディレクトリの変更時刻は無視されます。 IUrlAccessor オブジェクトは、子オブジェクトを列挙して、変更または削除があったかどうかを判断する必要があります。
UrlAccessor オブジェクトの設計の多くは、構造が階層型かリンクベースかに依存します。 階層データ ストアの場合、UrlAccessor オブジェクトは、その内容を列挙できるフィルターを見つける必要があります。 階層型とリンクベースのプロトコル ハンドラーのもう 1 つの違いは、IsDirectory メソッドの使用です。 リンク ベースのプロトコル ハンドラーでは、このメソッドはS_FALSEを返す必要があります。 階層型プロトコル ハンドラーは、コンテナーのS_OKを返す必要があります。
IUrlAccessor インターフェイスの実装の詳細については、IUrlAccessor インターフェイスの リファレンスを参照してください。
IProtocolHandlerSite
このインターフェイスは、SearchProtocol オブジェクトをインスタンス化するために使用されます。また、指定したクラス ID (CLSID) に対する適切なフィルターを使用して、UrlAccessor オブジェクトを提供します。
コンテナー用 IFilter
階層型プロトコル ハンドラーを実装する場合は、コンテナーまたはフォルダーを表す URL を列挙する IFilterコンポーネントコンテナーを実装する必要があります。 IFilter インターフェイスの GetChunk メソッドと GetValue メソッドをループ処理する列挙プロセスにより、コンテナー内の各項目を表すURLの一覧が返されます。
まず、GetChunk は、プロパティ セット GATHER_PROPSET と次のいずれかを含む FULLPROSPEC を返します。
- PID_GTHR_DIRLINK、最終変更時刻のないアイテムへの URL、または
- PID_GTHR_DIRLINK (最終更新時刻を含む URL)
GATHER_PROPSETのプロパティ セット GUID は 0B63E343-9CCC-11D0-BCDB-00805FCCCE04 です。 PROPSPEC プロパティは、PID_GTHR_DIRLINK =2 または PID_GTHR_DIRLINK_WITH_TIME = 12 decimal です。
PID_GTHR_DIRLINK_WITH_TIMEを返す方が効率的です。インデクサーは、ISearchProtocol->CreateUrlAccessor() メソッドと IUrlAccessor->GetLastModified() メソッドを呼び出さずに、アイテムのインデックスを作成する必要があるかどうかをすぐに判断できるためです。
次に、GetValue は、URL の PROPVARIANT(使用した場合、最終変更時刻も含む)を次のいずれかとして返します。
- VT_LPWSTR、子項目の URL、または
- URL のベクトルの後に FILETIME が続く
次のサンプル コードは、適切なPID_GTHR_DIRLINK_WITH_TIMEを構築する方法を示しています。
手記
このコードと情報は、明示または黙示を問わず、商品性や特定の目的への適合性に関する黙示的な保証を含むがこれらに限定されない、いかなる種類の保証もなく「現状のまま」で提供されます。
Copyright (C) Microsoft。 全著作権を保有します。
// params are assumed to be valid
HRESULT GetPropVariantForUrlAndTime(PCWSTR pszUrl, const FILETIME &ftLastModified, PROPVARIANT **ppPropValue)
{
*ppPropValue = NULL;
// allocate the propvariant pointer
*ppPropValue = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*ppPropValue));
HRESULT hr = *ppPropValue ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
PropVariantInit(*ppPropValue); // zero init the value
// now allocate enough memory for 2 nested PropVariants.
// PID_GTHR_DIRLINK_WITH_TIME is an array of 2 PROPVARIANTs
PROPVARIANT *pVector = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*pVector) * 2);
hr = pVector ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
// set the container PROPVARIANT that it is a vector of 2 PROPVARIANTS
(*ppPropValue)->vt = VT_VARIANT | VT_VECTOR;
(*ppPropValue)->capropvar.cElems = 2;
(*ppPropValue)->capropvar.pElems = pVector;
PWSTR pszUrlAlloc;
hr = SHStrDup(pszUrl, &pszUrlAlloc);
if (SUCCEEDED(hr))
{
// now fill the array of PROPVARIANTS
// put the pointer to the URL into the vector
(*ppPropValue)->capropvar.pElems[0].vt = VT_LPWSTR;
(*ppPropValue)->capropvar.pElems[0].pwszVal = pszUrlAlloc;
// put the FILETIME into vector
(*ppPropValue)->capropvar.pElems[1].vt = VT_FILETIME;
(*ppPropValue)->capropvar.pElems[1].filetime = ftLastModified;
}
else
{
CoTaskMemFree(pVector);
}
}
if (FAILED(hr))
{
CoTaskMemFree(*ppPropValue);
*ppPropValue = NULL;
}
}
return S_OK;
}
手記
IFilterコンポーネントコンテナーは、子 URL が変更されていない場合でも常にすべての子 URL を列挙する必要があります。これは、インデクサーが列挙プロセスを通じて削除を検出するためです。 DIR_LINKS_WITH_TIMEの日付出力でデータが変更されていないことが示されている場合、インデクサーはその URL のデータを更新しません。
物理 URL は、UrlAccessor オブジェクトが処理する URL です。 フィルターがユーザーフレンドリな DisplayUrl を出力しない場合、WDS は検索結果の一部としてユーザーへの物理 URL を表示します。 WDS スキーマには、次の表に示すように、エンド ユーザーに表示される内容を制御する 2 つのプロパティが含まれています。
GUID | PROPSPEC | 説明 |
---|---|---|
D5CDD505-2E9C-101B-9397-08002B2CF9AE | DisplayFolder | 検索結果にユーザーに表示されるフォルダー パス |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | フォルダ名 | 親フォルダーの表示名 |
コードが DisplayFolder または FolderName を出力しない場合、これらの値は DisplayUrl から計算されます。 URL のスラッシュは、ストアまたはファイル システム内のコンテナーを示します。
プロトコル ハンドラー オプション機能の追加
プロトコル ハンドラーに既定のスタート ページ (およびエントリ ノード URL) を設定するには、ISearchProtocolOptions インターフェイスを実装する必要があります。 WDS の将来のバージョンでは、このインターフェイスは、強化されたユーザー エクスペリエンスのオプション ダイアログへのフックを提供します。 このインターフェイスには、次の機能があります。
- プロトコル ハンドラーの要件が満たされているかどうかを判断します。 たとえば、プロトコル ハンドラーのストアでは、アプリケーションのデータに適切にインデックスを付けるために特定のアプリケーションへのアクセスが必要になる場合がありますが、そのアプリケーションは使用できません。
- プロトコル ハンドラーが項目を処理するために必要な最小要件を識別します。 要件は、"Microsoft Outlook 2000 以上" などのわかりやすいローカライズされた説明で表すことができます。
- プロトコル ハンドラーが既定で処理する URL を定義します。
ISearchProtocolOptions
次の表では、ISearchProtocolOptions インターフェイスに実装する必要があるメソッドについて説明します。
方式 | 説明 |
---|---|
CheckRequirements | カスタム プロトコル ハンドラーの最小要件が満たされているかどうかを判断します |
GetDefaultCrawlScope | カスタム プロトコル ハンドラーの指定したストア内の既定の URL の一覧を返します。 |
GetRequirements | カスタム プロトコル ハンドラーの最小要件に関するわかりやすいローカライズされた説明を識別します |
関連トピック