アイコン ハンドラーを作成する方法

多くの場合、ファイルの種類には、Windows エクスプローラーでメンバーを簡単に認識できるようにするために、カスタム アイコンが関連付けられています。 カスタム アイコンをファイルの種類に割り当てる最も簡単な方法は、アイコンのファイルを登録することです。 ただし、この方法で登録されたアイコンは、ファイルの種類のすべてのメンバーで同じになります。 アイコン ハンドラーを実装することで、ファイルの種類のメンバーにアイコンを割り当てる柔軟性を大幅に向上させることができます。

アイコン ハンドラーは、ファイルの種類のメンバーにアイコンを動的に割り当て可能なシェル拡張ハンドラーの一種です。 型のファイルが表示されるたびに、シェルはハンドラーに適切なアイコンを照会します。 たとえば、アイコン ハンドラーは、ファイルの種類の異なるメンバーに異なるアイコンを割り当てたり、ファイルの現在の状態に基づいてアイコンを変更したりできます。

シェル拡張ハンドラーを実装および登録するための一般的な手順については、「 シェル拡張ハンドラーの作成」を参照してください。 このドキュメントでは、アイコン ハンドラーに固有の実装のこれらの側面に焦点を当てます。

Instructions

手順 1: アイコン ハンドラーの実装

すべてのシェル拡張ハンドラーと同様に、アイコン ハンドラーは DLL として実装されたインプロセス コンポーネント オブジェクト モデル (COM) オブジェクトです。 IUnknown に加えて、IPersistFileIExtractIcon という 2 つのインターフェイスをエクスポートする必要があります。

シェルは、 IPersistFile インターフェイスを使用してハンドラーを初期化します。 このインターフェイスを使用して、ハンドラーのクラス識別子 (CLSID) を要求し、ファイルの名前を指定します。 操作の残りの部分は 、IExtractIcon インターフェイスを介して行われます。 IPersistFile インターフェイスを含むシェル拡張ハンドラーを実装する方法の一般的な説明については、「Creating Shell Extension Handlers」を参照してください。 このドキュメントの残りの部分では、 IExtractIcon インターフェイスを実装する方法について説明します。

手順 2: IExtractIcon インターフェイスの実装

インターフェイスが初期化されると、シェルはハンドラーの IExtractIcon インターフェイスを使用して適切なアイコンを要求します。 インターフェイスには、 IExtractIcon::GetIconLocationIExtractIcon::Extract の 2 つのメソッドがあります。

アイコンは、ファイル システム内の場所によって識別されます。 この情報を要求するには、 IExtractIcon::GetIconLocation メソッドが呼び出されます。 szIconFile パラメーターをファイル名に設定します。 ファイルに複数のアイコンがある場合は、 piIndex をアイコンのインデックスに設定します。 2 つのフラグ変数に適切な値を割り当てます。 ファイル名を指定しない場合、またはシェルでアイコンを抽出しない場合は、pwFlags パラメーターに GIL_NOTFILENAME フラグを設定します。 szIconFile に値を割り当てる必要はありませんが、シェルが IExtractIcon::Extract を呼び出すとき、ハンドラーはアイコン ハンドルを指定する必要があります。

ファイル名を返すと、シェルは通常、キャッシュからアイコンの読み込みを試みます。 キャッシュされたアイコンが読み込まれるのを防ぐには、pwFlags パラメーターに GIL_DONTCACHE フラグを設定します。 キャッシュされたアイコンが読み込まれていない場合、シェルは IExtractIcon::Extract を呼び出してアイコン ハンドルを要求します。

IExtractIcon::GetIconLocation によってファイルとインデックスが指定された場合、これらはそれぞれ pszFile パラメーターと nIconIndex パラメーターで IExtractIcon::Extract に渡されます。 ファイル名が指定されている場合、ハンドラーは S_FALSEを返してシェルにアイコンを抽出させることができます。 それ以外の場合、ハンドラーは大小のアイコンを抽出または生成し、その HICON ハンドルを phiconLarge パラメーターと phiconSmall パラメーターに割り当てる必要があります。 シェルは、ハンドラーへの後続の呼び出しを迅速に行うために、アイコンをキャッシュに追加します。

手順 3: アイコン ハンドラーの登録

ファイルの種類 のアイコンを静的に登録 する場合は、 そのファイルの種類の ProgID の下に DefaultIcon サブキーを作成します。 既定値は、アイコンを含むファイルに設定されます。 アイコン ハンドラーを登録するには、 DefaultIcon サブキーが残っている必要がありますが、既定値は "%1" に設定する必要があります。 ProgID サブキーの Shellex サブキーに IconHandler サブキーを追加し、既定値をハンドラーの CLSID GUID の文字列形式に設定します。 シェル拡張機能ハンドラーを登録する方法の一般的な説明については、「 シェル拡張機能ハンドラーの作成」を参照してください。

次の例では、.myp ファイルの種類が静的に定義されたアイコンではなくショートカット メニュー ハンドラーを使用するように、 アイコンのカスタマイズ からレジストリ エントリを変更します。

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = %1
      Shellex
         IconHandler
            (Default) = {The handler's CLSID GUID}

シェル拡張機能ハンドラーの作成

IPersistFile

IExtractIcon