IShellIconOverlay
COM公式ドキュメント
名前空間拡張が、それに含まれるオブジェクトのアイコンオーバーレイを指定するために使用するメソッドを公開します。
解説(Remarks)
アイコンオーバーレイは、Shell オブジェクトを表すアイコンの左下隅に配置される小さな画像です。通常、アイコンに何らかの追加情報を付加するために使用されます。よく使われるアイコンオーバーレイの例として、ファイルやフォルダーのアイコンがショートカットを表していることを示す小さな矢印があります。
アイコンオーバーレイはシステムイメージリストの一部です。これらには 2 つの識別子があります。1 つは、イメージリスト内の他のオーバーレイに対する相対的なオーバーレイを識別する、1 から始まるオーバーレイインデックスです。もう 1 つは、実際の画像を識別するイメージインデックスです。これら 2 つのインデックスは、ImageList::SetOverlayImage でプライベートイメージリストにアイコンオーバーレイを追加する際に、それぞれ iOverlay パラメーターと iImage パラメーターに割り当てる値と同等です。
オブジェクトのアイコンを表示する前に、Shell は関連付けられたフォルダーの IShellIconOverlay インターフェイスを呼び出して、そのオブジェクトのアイコンにオーバーレイを付けるべきかどうかを照会します。通常は IShellIconOverlay::GetOverlayIndex を呼び出して、オーバーレイのオーバーレイインデックスを要求します。場合によっては、Shell が IShellIconOverlay::GetOverlayIconIndex を呼び出して、オーバーレイのイメージインデックスを要求することもあります。アイコンオーバーレイを指定するには、これらのメソッドは要求されたインデックスを返す必要があります。それ以外の場合は S_FALSE を返します。
アイコンオーバーレイを指定するには、両方のメソッドともまず SHGetIconOverlayIndex を呼び出して、システムイメージリスト内のオーバーレイのオーバーレイインデックスを取得する必要があります。SHGetIconOverlayIndex が初めて呼び出されると、Shell はオーバーレイのファイル名とファイル内のインデックスを使用して、その画像をシステムイメージリストに追加します。オーバーレイがシステムイメージリストに追加された後は、Shell は単にファイル名とインデックスを識別子として使用します。SHGetIconOverlayIndex を使用して、いくつかの標準的なシステムオーバーレイのオーバーレイインデックスを取得することもできます。IShellIconOverlay::GetOverlayIndex は、単にオーバーレイインデックスを Shell に返します。IShellIconOverlay::GetOverlayIconIndex は、INDEXTOOVERLAYMASK マクロを使用して、オーバーレイインデックスを同等のイメージインデックスに変換する必要があります。
システムがサポートできる異なるアイコンオーバーレイハンドラーの数は、システムイメージリスト内でアイコンオーバーレイに利用できる領域の量によって制限されます。現在、アイコンオーバーレイには 15 個のスロットが割り当てられており、そのうちのいくつかはシステムによって予約されています。このため、アイコンオーバーレイは、満足のいく代替手段がない場合にのみ指定すべきです。
このインターフェイスは、オブジェクトに対してアイコンオーバーレイを指定する必要のある名前空間拡張によって実装されます。
このインターフェイスは、通常はアプリケーションでは使用されません。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
システムイメージリスト内のオーバーレイインデックスを取得します。
| pidl | ITEMIDLIST* | in | アイコンが表示されるオブジェクトを識別する ITEMIDLIST 構造体へのポインター。 |
| pIndex | INT* | inout | システムイメージリスト内のオーバーレイインデックス(1 から始まる)を示す値へのポインター。このインデックスは、ImageList::SetOverlayImage 関数でプライベートイメージリストにオーバーレイ画像を追加する際に指定される iOverlay 値と同等です。 |
戻り値
型: HRESULT
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| オーバーレイのインデックスが見つかりました。 | |
| このファイルにはオーバーレイが存在しません。 | |
| PIDL が無効です。 | |
| 引数が無効です。たとえば、pIndex が NULL の場合などです。 | |
| 呼び出し元アプリケーションが OI_ASYNC を渡し、オーバーレイインデックスの計算処理に時間がかかることを示しました。 |
解説(Remarks)
システムイメージリスト内のオーバーレイインデックスを取得するには、SHGetIconOverlayIndex を呼び出します。
このメソッドを呼び出す際に pIndex が OI_ASYNC を指すように設定した場合、Shell のアイコンオーバーレイハンドラーは、オーバーレイインデックスを pIndex に格納する代わりに E_PENDING を返すことがあります。この戻り値は、オーバーレイの計算が低速な処理であり、バックグラウンドで処理すべきであることを示します。IShellIconOverlay の実装が E_PENDING を返すと、OI_ASYNC フラグなしでバックグラウンドのワーカースレッド上で再び呼び出されます。GetOverlayIndex を呼び出す際に OI_ASYNC を使用しない場合、オーバーレイハンドラーは戻る前にオーバーレイインデックスを計算し、その値を pIndex に格納する必要があります。
システムイメージリスト内のアイコンオーバーレイのインデックスを取得します。
| pidl | ITEMIDLIST* | in | アイコンが表示されるオブジェクトを識別する ITEMIDLIST 構造体へのポインター。 |
| pIconIndex | INT* | inout | システムイメージリスト内のアイコンオーバーレイの画像のインデックスへのポインター。このインデックスは、ImageList::SetOverlayImage 関数でプライベートイメージリストにオーバーレイ画像を追加する際に指定される iImage 値と同等です。 |
戻り値
型: HRESULT
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| オーバーレイのインデックスが見つかりました。 | |
| このファイルにはオーバーレイが存在しません。 | |
| PIDL が無効です。 |
解説(Remarks)
システムイメージリスト内のオーバーレイのイメージインデックスを取得するには、まず SHGetIconOverlayIndex を呼び出してオーバーレイインデックスを取得する必要があります。次に、INDEXTOOVERLAYMASK マクロを使用して、オーバーレイインデックスを同等のイメージインデックスに変換します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IShellIconOverlay "{7D688A70-C613-11D0-999B-00C04FD655E1}" #usecom global IShellIconOverlay IID_IShellIconOverlay "{}" #comfunc global IShellIconOverlay_GetOverlayIndex 3 var,var #comfunc global IShellIconOverlay_GetOverlayIconIndex 4 var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IShellIconOverlay "{7D688A70-C613-11D0-999B-00C04FD655E1}" #usecom global IShellIconOverlay IID_IShellIconOverlay "{}" #comfunc global IShellIconOverlay_GetOverlayIndex 3 sptr,sptr #comfunc global IShellIconOverlay_GetOverlayIconIndex 4 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。