Shell Extension を使って Explorer に項目を追加する

ShellExtension の定義方法の覚書き。
Explorer の「詳細」メニューで表示するカラムを追加することができます。

1. Wizard を使って,IDL に実装クラスを定義する。
// MyColumn.idl : MyColumn の IDL ソース
//

// このファイルは、タイプ ライブラリ (MyColumn.tlb) およびマーシャリング コードを
// 作成するために MIDL ツールによって処理されます。

import "oaidl.idl";
import "ocidl.idl";

[
	object,
	uuid(EEC69ED1-4D69-485B-8AF9-4A5EEEE0EFC8),
	helpstring("IMyColExt インターフェイス"),
	pointer_default(unique)
]
interface IMyColExt : IUnknown{
};
...................................................
[
	uuid(7A7CEC4E-FD39-4983-9A3F-C791214721BC),
	version(1.0),
	helpstring("ColExtTest 1.0 タイプ ライブラリ")
]
library HardLinkColumnLib
{
	importlib("stdole2.tlb");
	[
		uuid(5451F3B5-9CFB-4F66-9CEC-B4A596066670),
		helpstring("MyColExt Class")
	]
	coclass MyColExt
	{
		[default] interface IMyColExt;
	};
	....................................................
};

2. IComPrivider を継承(実装)する COM クラスを定義する。
class ATL_NO_VTABLE CMyColExt :
	public CComObjectRootEx,
	public CComCoClass,
	public IColumnProvider
{
	...................................
public:
	STDMETHODIMP Initialize(LPCSHCOLUMNINIT psci);
	STDMETHODIMP GetColumnInfo(DWORD dwIndex, SHCOLUMNINFO* psci);
	STDMETHODIMP GetItemData(LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT* pvarData);
	...................................
};

3. IColumnProvider のメソッドを実装する。

* 特に処理がなければ,Initialize は何もしなくてよい
STDMETHODIMP
CMyColExt::Initialize(LPCSHCOLUMNINIT psci) {
    return S_OK;
}

* GetColumnInfo では,カラム定義を設定して返す。
STDMETHODIMP
CMyColExt::GetColumnInfo(DWORD dwIndex, SHCOLUMNINFO* psci) {
    if(dwIndex != 0) {
        return S_FALSE;
    }
    psci->scid.fmtid = CLSID_LinkColExt;
    psci->scid.pid   = 0;
    psci->vt         = VT_I4;				
    psci->fmt	     = LVCFMT_RIGHT;
    psci->csFlags    = SHCOLSTATE_TYPE_INT | SHCOLSTATE_SLOW;
    psci->cChars     = 10;

    ::wcsncpy_s(psci->wszTitle, OLESTR("MyColumn"));
    ::wcsncpy_s(psci->wszDescription, OLESTR("Length of File Name");

    return S_OK;
}

* GetItemData で個別の値を取得して返す。
STDMETHODIMP
CMyColExt::GetItemData(LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT* pvarData) {
    if(pscid->fmtid != CLSID_LinkColExt || pscid->pid != 0) {
        return S_FALSE;
    }
    return CComVariant(::wcslen(pscd->wszFile).Detach(pvarData);
}

4. レジストリへの登録は,次のスクリプトで。
HKCR
{
    NoRemove CLSID
    {
        ForceRemove {5451F3B5-9CFB-4F66-9CEC-B4A596066670} = s 'MyCol Extension Class'
        {
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }
        }
    }
    NoRemove Folder
    {
        NoRemove Shellex
        {
            NoRemove ColumnHandlers
            {
                ForceRemove {5451F3B5-9CFB-4F66-9CEC-B4A596066670} = s 'MyCol column ext'
            }
        }
    }
}


この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
rank← ランキングはこちらをクリック!

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。