2006 年 11 月 16 日 23 時 2 分

IShellIconOverlayIdentifier インタフェース


このアーカイブは同期化されません。 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 つ必要になる。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.