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

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

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

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

手順

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

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

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