このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
そろそろ本題も進めていきたいので、
実際に使うインタフェースを取り上げてみよう。
シェルに独自の重ね合わせアイコンを提供するサーバは、
IShellIconOverlayIdentifier を実装したクラスを作成し、
アイコンに関する情報をシェルに通知する必要がある。
IShellIconOverlayIdentifier の定義を以下に示す。
class IShellIconOverlayIdentifier : public IUnknown {
public:
virtual HRESULT STDMETHODCALLTYPE IsMemberOf(
/* [in] */ LPCWSTR pwszPath,
/* [in] */ DWORD dwAttrib) = 0;
virtual HRESULT STDMETHODCALLTYPE GetOverlayInfo(
/* [out] */ LPWSTR pwszIconFile,
/* [in] */ int cchMax,
/* [out] */ int* pIndex,
/* [out] */ DWORD* pdwFlags) = 0;
virtual HRESULT STDMETHODCALLTYPE GetPriority(
/* [out] */ int* pPriority) = 0;
};
IShellIconOverlayIdentifier は 1 つのアイコンを表し、
表示するアイコンの種類と、表示先を決める役割を持つ。
IShellIconOverlayIdentifier は 3 つのメソッドを持つ。
これを実装するクラスは、IUnknown と合わせて
合計 6 つのメソッドの実装が必要となる。
シェルエクステンションがシェルに読み込まれると、
最初に GetOverlayInfo メソッドが呼びだされる。
GetOverlayInfo は、初期化用のメソッドに相当し、
このクラスが管理しているアイコンの場所を返す。
アイコンの読み込みはシェルによって行われ、
表示を高速化するために、実行中は常にキャッシュされる。
そのため、GetOverlayInfo は最初に呼び出され、
実行中はアイコンを変更することはできない。
GetPriority は、ファイルやフォルダに、
複数の重ね合わせアイコンが該当した場合、
どれを優先して表示するかを決定するために呼び出される。
実装側は、優先順位を表す数値を返す必要がある。
GetOverlayInfo や GetPriority は、初期化用メソッドだが、
エクスプローラによって複数回呼び出される可能性もある。
この場合でも、常に同じ値を返すことが要求される。
そして、IsMemberOf は ファイルやフォルダを表示する際に、
シェルによって繰り返し呼び出される。
実装側は、指定された名前を持つファイルに、
自分のアイコンを重ねて表示するべきかどうかを返す。
以上の 3 つのメソッドをクラスに実装することが、
シェルに重ね合わせアイコンを表示する第 1 歩となる。
今回は、ハードリンクやマウントポイント、
そしてフォルダリンクなどのアイコンを提供する。
これら 3 種類には異なるアイコンを使う予定なので、
上記インタフェースを実装したクラスが 3 つ必要になる。