2. 实现IShellExtInit接口的Initialize方法,在类定义中增加如下内容: STDMETHOD (Initialize) (LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj,HKEY hkeyProgID);
|
Initialize方法的代码如下,从lpdobj对象中取出资源管理器中选择的文件名,程序假定只选择了一个文件。 HRESULT __stdcall TAddContextMenuImpl::
Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT lpdobj, HKEY hkeyProgID)
{
FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stg = { TYMED_HGLOBAL };
HDROP hDrop;
if (FAILED(lpdobj->GetData(&fmt, &stg))) return E_FAIL;
hDrop = (HDROP)GlobalLock(stg.hGlobal);
if ( hDrop == NULL)
{
ReleaseStgMedium(&stg);
return E_OUTOFMEMORY;
}
DragQueryFile(hDrop, 0, g_szFilePath, MAX_PATH);
GlobalUnlock(stg.hGlobal);
ReleaseStgMedium(&stg);
return S_OK;
}
|
3. 实现IContextMenu接口的各个方法,内容如上文所示,声明如下: public:
STDMETHOD (QueryContextMenu) (HMENU hmenu,UINT indexMenu,UINT idCmdFirst,UINT idCmdLast,UINT uFlags);
STDMETHOD (InvokeCommand) (LPCMINVOKECOMMANDINFO pici);
STDMETHOD (GetCommandString) (UINT idCmd,UINT uFlags,UINT *pwReserved,LPSTR pszName,UINT cchMax);
|
最后,把工程编译为DLL文件,运行菜单[Run->Register ActiveX Server],把DLL注册。与Delphi和VC相比,C++ Builder似乎有些缺陷。首先,它实现时太过复杂,生成的文件一大堆。最麻烦的是,它无法实现自动注册为shell扩展,它没有VC的rgs文件,像Delphi那样改写UpdateRegistry函数,怎么也不行,好像这个函数没有调用一样。无奈,只好自己动手向注册表添加必须的项目(如图)。但是,C++ Builder给出了3个CLSID,很迷惑人,正确的CLSID应该是类AddContextMenu的,C++ Builder给它命名为CLSID_AddContextMenu。 注册后,在资源管理器右击任何文件,如readme.txt,都将打开一个选择文件的对话框,然后shell用选择的文件打开readme.txt。 (e129)
<<上一页
1
2
3
4
5
|