(本文根据«windows shell扩展编程完全指南»改写)
开始编写上下文菜单 – 它该做些什么? 开头先让我们做简单一些, 只弹出一个对话框以表明当前的扩展能够正常地工作.我们把扩展关联到 .txt 文件, 因此当用户右键单击文本文件对象时扩展就会被调用. 使用 appwizard 开始 好吧, 让我们开始吧! 什么? 我还没告诉你怎样使用那些神秘的 shell 扩展接口?别着急, 我会边进行边解释的.我觉得先解释一下一个概念再紧接着说明示例代码,对理解例子程序会更简单一些. 当然我也可以把所有的东西都先解释完,然后再解释代码, 但我觉得这样做不能吸引人的注意力.不管怎么样, 向 vc开火,开始! 运行appwizard,生成一个名为simpleext 的 atl com 工程. 保留所有默认的设置选项,点击”完成”. 现在我们已经有了一个空的 atl工程,它可以编译并生成一个 dll, 但我们还需要添加shell扩展的 com 对象.在 classview 中, 右击 simpleext classes 条目, 选择 new atl object. 【程序编程相关:MFC程序员的WTL指南之属性页与向导】
【推荐阅读:VC里面如何拆分含汉字与字母的字符串】hresult ishellextinit::initialize ( lpcitemidlist pidlfolder, lpdataobject pdataobj, hkey hprogid );
【扩展信息:MSComm控件属性大揭秘】
在atl object wizard里, 第一页默认已经选择了 simple object , 所以单击 next 即可. 在第二页中, 在short name 文本框里输入 simpleshlext ,点击 ok. (其余的文本框会自动填充完.) 这样就创建了一个名为 csimpleshlext 的类,其包含了实现com对象最基本的代码. 我们将在这个类中加入我们自己的代码. 初始化接口 当我们的shell扩展被加载时, explorer 将调用我们所实现的com对象的 queryinterface() 函数以取得一个 ishellextinit 接口指针.该接口仅有一个方法 initialize(), 其函数原型为:
explorer 使用该方法传递给我们各种各样的信息.pidlfolder是用户所选择操作的文件所在的文件夹的 pidl 变量. (一个 pidl [指向id 列表的指针] 是一个数据结构,它唯一地标识了在shell命名空间的任何对象, 一个shell命名空间中的对象可以是也可以不是真实的文件系统中的对象.)pdataobj 是一个 idataobject 接口指针,通过它我们可以获取用户所选择操作的文件名.hprogid 是一个hkey 注册表键变量,可以用它获取我们的dll的注册数据. 在这个简单的扩展例子中, 我们将只使用到 pdataobj 参数.要添加这个接口进 com 对象, 先打开simpleshlext.h 文件, 然后加入下列标红的代码:
#include "shlobj.h"#include "comdef.h"class atl_no_vtable csimpleshlext :public ccomobjectrootex, public ccomcoclass, public idispatchimpl,public ishellextinitbegin_com_map(csimpleshlext) com_interface_entry(isimpleshlext) com_interface_entry(idispatch) com_interface_entry(ishellextinit) end_com_map()
com_map是atl实现 queryinterface()机制的宏,它包含的列表告诉atl其它外部程序用queryinterface()能从我们的 com对象获取哪些接口. 接着,在类声明里, 加入initialize()的函数原型. 另外我们需要一个变量来保存文件名:
... 下一页