如何编程实现扩展右键菜单之一:增加自己的菜单项

      我们在使用各种软件时,常常可以发现,许多软件在资源管理器的右键菜单中增加了自己的功能菜单,比如WinRAR、WinZIP、7Z等压缩软件等。本文将介绍如何编程实现增加自己的右键菜单。

01

      阅读本文要求读者熟悉VC,了解COM,同时由于示例代码是用ATL编写,因此读者需要对ATL有一定了解。本文示例是以VC6为开发环境,但所有代码在VC6、VC2005、VC2008下均可编译通过。

一. 开始

      本文将一步一步的介绍如何编写一个简单的右键菜单示例,完成此示例后,右键点击文本文件,将弹出我们的右键菜单,选择此菜单将弹出对话框显示所选择的文件名称。

      右键菜单扩展一般可实现为一个COM组件,Windows将载入这些COM组件并调用一些特定的接口。因此,我们需要创建一个COM组件。

      首先,使用VC的AppWizard新建一个ATL COM项目,项目名称为“SimpleShlExt”,项目设置就使用默认设置。

02

      完成后,向此项目加入一个新的ATL对象,对象类型为“Simple Object”

03

      输入对象名称为“ShlExtObj”

04

      Shell扩展对象不需要实现双接口,不需要实现聚集,因此可按下图设置:

05

      确定后,类向导生成一个名称为“CShlExtObj”的类,其中包含一些用于实现COM组件的基本代码。

二. 实现IShellExtInit接口

      当Windows加载我们的Shell扩展时,Explorer.exe进程将首先通过QueryInterface()方法获取指向IShellExtInit接口的指针。IShellExtInit接口只有一个方法,名称为Initialize(),其原型为:

HRESULT IShellExtInit::Initialize ( 
  LPCITEMIDLIST pidlFolder, 
  LPDATAOBJECT pDataObj, 
  HKEY hProgID 
)

      在explorer.exe进程调用此方法时,pidlFolder是PIDL指针(PIDL是一个用于唯一标示Shell中的对象的数据结构),pDataObj是指向IDataObject接口的指针,通过此指针,我们可以获取右键点击时所选中的文件及目录的名称,hProgID是HKEY句柄,通过它我们可以访问保护我们的扩展DLL的注册表信息。

      在本例中,我们只需要使用pDataObj即可。

      现在,我们需要让我们的CShlExtObj对象实现IShellExtInit接口。首先,打开ShlExtObj.h文件,键入标为粗体的代码以实现IShellExtInit接口,因为此COM组件不需要实现自己的接口,因此可以删除标注有删除线的代码

class ATL_NO_VTABLE CShlExtObj : 
	public CComObjectRootEx,
	public CComCoClass,
	public IShlExtObj
	public IShellExtInit
{
  
public:
	CShlExtObj()
	{
  
	}
DECLARE_REGISTRY_RESOURCEID(IDR_SHLEXTOBJ)
DECLARE_NOT_AGGREGATABLE(CShlExtObj)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CShlExtObj)
	COM_INTERFACE_ENTRY(IShlExtObj)
	COM_INTERFACE_ENTRY(IShellExtInit)
END_COM_MAP()

// IShlExtObj
public:
};

 

      现在,需要在ShlExtObj.h中增加对IShellExtInit::Initialize()方法的声明,此外还需要声明一个变量以保存文件名

private:
	TCHAR m_szFilename[MAX_PATH];

public:
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值