用C++Builder实现IE快捷菜单
庞巍伟
2001年 30期
用过NetAnts的朋友都知道,它会在IE的右键快捷菜单中加入“Download All By NetAnts”的项目,点一下它,NetAnts就会得到当前网页的所有链接,方便用户快速下载文件。这是怎么做的呢?
要解决这个问题,我们先抽象出问题的实质:
1在IE的快捷菜单中加入自己的项目。
2使该项目指向自己的程序,并将所有的链接、链接描述等信息作为参数传递给自己的程序。
对于第一步来说,修改过注册表的朋友都能轻易实现。首先打开注册表编辑器(regedit.exe),在HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt键下,你可以看到 Download &All By NetAnts 的子键(如果安装了NetAnts的话),其中“&”符号后面的字母标识了快捷键的按键。
在该子键下仅有两个键值(如^30020504a^),其中“默认”表示菜单所指向的文件,“Contexts”则表示你添加的菜单项目在什么情况下出现。我们注意到,NetAnts指向的是NAGetAll.htm文件,根据笔者研究发现,它不可以指向EXE文件,就算指向EXE文件,IE也不会启动它。Contexts的值是243,表示除了在文本框的快捷菜单以外的菜单中都出现NetAnts的菜单;如果是255,则表示任何情况下都出现;如果是12的话,则只在文本框的快捷菜单中才出现。
既然指向的是htm文件,那么如何启动NetAnts,又如何传递参数呢?我们先打开NaGetAll.htm文件,可以看到如下代码:
原来是一段VBScript,并且调用了NetAnts对象,至此问题的关键所在已经知道了,就是要创建一个自己的COM对象。创建COM对象不太容易,但用VB,Delphi这样的快速开发工具倒也不难。下面笔者就用C++ Builder为例来创建一个COM对象完成上述功能。
启动C++ Builder创建一个新的工程,在Form1中加入一个ListBox组件,用于显示加入的连接地址。在该工程下新建一个Automation Object,输入GetUrl,其余保持不变,按OK钮,这样C++ Builder将为你创建一系列文件用于描述COM结构,我们所要做的就是添加接口和方法。
在IGetUrl接口中加入AddHrefList方法,并且添加一个Variant*类型的参数pList,设置返回值为HRESULT,
然后点按刷新按钮,C++ Builder会自动刷新所需文件。在工程管理器中打开GetUrlImpl.cpp文件,会看到刚才接口的实现函数的声明,添加如下代码,并保存工程。
Variant* vp=(Variant*)pList; //转换为Variant类,在此转换成SafeArray*也可,但麻烦一些
int di=vp->ArrayDimCount(); //得到数组的维数
if (di>1)
return 0;
int hb=vp->ArrayHighBound();//得到数组的上下标
int lb=vp->ArrayLowBound
for (int n=lb;n<=hb;n++)
{
Variant vi=vp->GetElement(n);//得到数组的元素
String ai=String(vi);
Form1->ListBox1->Items->Add(ai);
}
return 1
现在,一个自动化对象已经创建完成。编译运行程序。就在系统中自动注册了类,以及类的所有接口。接下来就很简单了,按照NaGetAll.htm文件的形式写一个VBScript,如下:
并且在注册表中加入开始讲的那样的键值,所有的工作就做完了。不过细心的读者会发现上述代码与NaGetAll.htm还是有一点出入,主要就在最后的Alert(“我成功了!”)上,这是为了解决对象生存期的问题,为了解决这个问题,需要将COM对象单独写在一个Dll中,其实NetAnts也是这样做的。