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'
}
}
}
}