アイコン、プレビュー、ショートカット メニューの追加

検索中にデータのインデックスが作成され、ユーザーに正しく表示されるようにするには、シェル データ ストア ( シェル名前空間拡張機能とも呼ばれます) とファイルの種類ハンドラー (シェル拡張機能、 拡張機能ハンドラー、またはシェル拡張ハンドラーとも呼ばれます) を実装する必要があります。

このトピックでは、次のインターフェイスについて説明します。

ファイル型ハンドラーの実装

これらのシェル拡張機能またはファイルの種類ハンドラーは、ユーザーに次のシェル エクスペリエンスを提供します。

  • 結果ビューには、アイテムの種類の特定のアイコンが表示されます。
  • ユーザーがアイテムを選択すると、結果ビューにアイテムのプレビューが表示されます。
  • ユーザーは項目をダブルクリックして、ファイルを開くなどのイベントを開始できます。
  • ユーザーは項目を右クリックして、ショートカット (コンテキスト) メニューにアクセスできます。
  • ユーザーは項目をドラッグ アンド ドロップできます。

すべてのコンポーネント オブジェクト モデル (COM) オブジェクトと同様に、ファイル型ハンドラーは IUnknown インターフェイスとクラス ファクトリを実装する必要があります。

Windows XP 以前では、ハンドラーは次も実装する必要があります。

Windows Vista では、 IPersistFile インターフェイスIShellExtInit インターフェイス は、シェルがハンドラーを初期化するための次の 3 つのインターフェイスに置き換えられました。

適切なユーザー エクスペリエンスを提供するには、プロトコル ハンドラーを使用してシェル データ ストアを提供する必要があります。 その後、そのデータ ストアは、アイコン ハンドラー、ショートカット メニュー ハンドラー、プレビュー ハンドラーなどの "ファクトリ" として機能します。 IShellFolder インターフェイスでは IPersist インターフェイスIPersistFolder インターフェイスの最小限の実装が必要であり、IContextMenuIExtractIcon には IShellFolder インターフェイスの最小限の実装が必要です。

注意

IPersist、IPersistFolder、およびIShellFolder には、同じクラス識別子 (CLSID) を実装する必要があります。

 

プロトコル ハンドラーをサポートするシェル データ ストアの作成の詳細については、「 基本的なフォルダー オブジェクト インターフェイスの実装」を参照してください。

IPersist

IPersist インターフェイスは、単一のメソッド GetClassID を定義します。これは、システムに永続的に格納できるオブジェクトの CLSID を指定するように設計されています。

メソッド 説明
GetClassID シェル データ ストア オブジェクトの CLSID を返します

 

IPersistFolder

IPersistFolder インターフェイスは、シェル フォルダー オブジェクトを初期化するために使用されます。 IPersist から派生したこのインターフェイスの実装は、フォルダーがシェル名前空間内のどこにあるかを示す方法です。 このインターフェイスは直接使用しません。 これは、シェル フォルダー オブジェクトを初期化するときに 、IShellFolder::BindToObject メソッド のファイル システム実装によって使用されます。

メソッド 説明
Initialize 渡された情報に基づいて自身を初期化するようにシェル フォルダー オブジェクトに指示し、S_OKを返します。

 

IShellFolder

IShellFolder インターフェイス インターフェイスはフォルダーの管理に使用され、プロトコル ハンドラー用に実装されたアイコンとコンテキスト インターフェイスが Windows 検索結果のユーザー インターフェイスで正しく動作するように、部分的な実装が必要です。 必要な機能のほとんどは、 GetUIObjectOf メソッドを使用して公開されます。 このメソッドを使用すると、アドインは IExtractIcon インターフェイスと IContextMenu インターフェイスに対してクエリを実行できます。

IShellFolder インターフェイス インターフェイスでは、URL ではなく PIDL が使用されます。 完全なシェル データ ストアの要件とは対照的に、アドインは URL のみを含む単純な IDL 構造を使用できます。

IShellFolder インターフェイスの次のメソッドを実装する必要があります。 これらのメソッドのうち 5 つでは、最小限の実装が必要です。

メソッド 説明
BindToObject E_NOTIMPLを返します
BindToStorage E_NOTIMPLを返します
CreateViewObject E_NOTIMPLを返します
SetNameOf E_NOTIMPLを返します
ParseDisplayName URL を PIDL 構造体に変換します
CompareIDs 2 つの PIDL 値を比較します
GetDisplayNameOf PIDL の URL を返します
GetUIObjectOf このメソッドは、 IUnknown::QueryInterface メソッドに似ています。 アイコンが要求された場合、呼び出し元はIID_IExtractIconを要求します。ショートカット メニューが要求された場合、呼び出し元はIID_IContextMenuを要求します

 

IShellFolder は、フォルダーの列挙には使用されません。 これは、フォルダーの表示名が物理 URL であることを意味します。 これは、今後変更される可能性があります。

IContextMenu

Windows Search でユーザーに結果が表示されると、ユーザーは項目を右クリックして、 IContextMenu インターフェイスで定義されたショートカット メニューを表示できます。 ショートカット メニューはコンテキスト メニューとも呼ばれます。

コンテキスト メニューの既定のアクションは、項目がダブルクリックされたときに実行されるアクションと同じです。 アイテムに対応する IShellFolder インターフェイスまたは IContextMenu インターフェイスがない場合、ダブルクリック イベントの既定の動作は、引数として URL を ShellExecute 関数関数 に渡すことです。

ショートカット メニュー ハンドラーの作成 の詳細については、コンテキスト メニュー ハンドラーの作成に関するページを参照してください。サンプル コードについては、「 Sample: Shell Extensions for Protocol Handlers 」を参照してください。

IExtractIcon

IExtractIcon は、プロトコル ハンドラーによって提供される PIDL の URL に基づいて、Windows Search ユーザー インターフェイスのアイコンを取得します。

アイコン ハンドラーの作成の詳細については、アイコン ハンドラーの作成に関するページを参照してください。サンプル コードについては、「サンプル: プロトコル ハンドラーのシェル拡張機能」を参照してください。

IPreviewHandler

IPreviewHandler は、Windows エクスプローラーで選択した項目のリッチ プレビューをレンダリングします。 プレビューは、Windows Search 4.0 または Windows デスクトップ検索 3.x を使用した Windows Vista で使用できます。

カスタム プレビュー ハンドラーを作成するには:

  1. プレビュー ハンドラーで提供されているガイドラインに従って、IStream を受け取る IPreviewHandler を実装します。

  2. プレビュー ハンドラーを登録します。

    HKEY_CLASSES_ROOT\<Your_Object_Type>
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}
       @ = {<Your_PreviewHandler_GUID>}
    
  3. URL のシェル フォルダーを実装するには、次の 2 つの手順を実行します。

    1. IShellFolder::GetUIObjectOf メソッドで、次のコード サンプルに示すように、IQueryAssociations を処理し、シェル項目の関連付けを返します。

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. シェルがデータ ストリームのシェル フォルダーを照会してプレビュー ハンドラーを初期化した後、 IShellFolder::BindToObject メソッド メソッド に移動し、IID_IStreamを処理し、 IStream を URL に返します。

ファイルの種類に対して既存のプレビュー ハンドラーを再利用するには、次の 2 つの手順に従います。

  1. Your_PreviewHandler_GUIDの代わりに、既存のプレビュー ハンドラーの CLSID を使用して、そのプレビュー ハンドラーを>ファイルの<種類に登録します。
  2. シェル フォルダーを実装します。

プレビュー ハンドラーの作成の詳細については、「 IPreviewHandlerプレビュー ハンドラー」を参照してください。

その他のリソース

概念

プロトコル ハンドラーの開発

プロトコル ハンドラーについて

変更のインデックスへの通知

コード サンプル: プロトコル ハンドラーのシェル拡張機能

プロトコル ハンドラーのインストールと登録

プロトコル ハンドラーの検索コネクタの作成

プロトコル ハンドラーのデバッグ