Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103782602
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-15 21:06:02

   来源:CSDN    作者:行舟

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。

阅读(308) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~