海贼王黄金城日语:用vc 对ie进行修改操作

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 14:27:00

用vc++对ie进行修改操作

        很多软件安装以后都会在IE浏览器的工具栏上添加一个自己的启动按钮,只要点击该按钮就可以启动自己的程序,比较典型的软件有网络蚂蚁、金山词霸、网际快车(FlashGet)等等。如图1所示,”FlashGet“按钮就是”网际快车“安装之后添加的按钮,这个按钮能方便用户启动程序,而不用从开始菜单中启动应用程序,节省了很多时间。

  这么好的功能,我们的程序当然也应该有!需要说明的是,IE4.0以下的版本并不支持该功能,直到IE5.0发布,才使该项技术大众化。那么怎么实现这个功能呢?下面让我们分析一下技术原理。IE启动的时候,它会去读取Windows注册表中相应的数据,如果该键值下面有数据并且是正确的,那么它将正确的显示出来。如果没有数据或者有数据但数据是非法的,那么他将不以理会。所以,实现该功能并不需要复杂的技术,仅仅是处理注册表而已!

  下面我们先看看这些有用的数据到底写在什么地方。运行RegEdit程序,打开HKEY_LOCAL_MACHINE SOFTWAREMicrosoftInternet ExplorerExtensions主键,并找到{D6E814A0-E0C5-11d4-8D29-0050BA6940E3}子键。该子键的具体含义我先不作解释,后文中将详细介绍。图2就是FlashGet在IE工具栏上显示按钮的奥秘所在其中,是显示在按钮上的文字,”FlashGet“就是显示在IE工具栏按钮上的文本。

  是一个GUID,标明FlashGet的类。

  按钮默认是否可见,我们当然希望按钮可见了,所以取值为”Yes“.

  可执行文件的路径及其文件名,即当点击按钮时,要执行的文件。

  顾名思义,就是当鼠标移动在该按钮上的时候所显示的图标,我们应该有这个经验,就是当鼠标移动到图标上的时候,图标的颜色会发生变化,就是这个意思。

  就是按钮所显示的图标。当鼠标没有移动上去的时候将显示图标。

  是菜单在状态条的提示。

  与按钮相应的”工具“菜单里的菜单项名称。

  在动手用VC++来完成这些工作之前,我们先来介绍一些预备知识一、上文中我们曾经提到过GUID.GUID(Globally Unique IDentifier),全球唯一标识符,是一个128位的随机数,是通过计算机的网卡和计算机的时间来共同产生的,所以几乎不会产生重复数。从理论上讲,如果一台机器上每秒产生10,000,000个GUID,那么也可以保证3240年以上不重复。既然是随机数,当然就不能保证绝对无重复,但我们已经可以看出,如果要重复的话,那概率是多么的小!

  手工构造这么一个128的随机数是相当麻烦的,所以VC++提供了两个工具来产生GUID.一个是UUIDGen.exe,这是一个命令行程序,所以我并不喜欢。另一个是GUIDGen.exe(如图3所示,你可以在Visual Studio安装目录的CommonTools中找到),该程序是一个基于对话框的程序,用它来产生GUID十分方便,所以我非常爱用它而不用UUIDGen.Exe.

  二、VC中的注册表操作函数主要要用到的注册表操作函数有RegCreateKeyEx()、RegSetValueEx()和RegOpenKeyEx()等。RegCreateKeyEx()的作用是创建一个键值,如果该键值存在的话,那么则打开它。RegSetValueEx()的作用是对某个特定的键值进行赋值。RegOpenKeyEx()的作用是打开一个键值。具体的函数参数请参考MSDN,这里就不再赘述了。

  下面我们以一个SDI为例演示函数的使用,为了与下文统一起来,请把它建立在”C:Test“.假设我们已经建立一个SDI应用程序Test并给CTestView添加了一个成员函数WriteReg().我们将在该函数中实现在IE浏览器的工具菜单上和IE的上下文菜单中添加我们的菜单,并实现响应菜单消息。在实现该函数之前,我们先用GUIDGen产生两个GUID:{32204547-1C47-11d5-A413-00A00CC191CF}和{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}.

  该函数的主要内容如下建立上下文菜单, lpSubKey, 0, ”“, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &phkResult,, ”我们自己的上下文菜单(&W)“, REG_SZ, keyValue,建立工具菜单, lpSubKey, 0, ”“, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL,&phkResult,, lpSubKey, 0, KEY_ALL_ACCESS,, ”CLSID“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),, ”MenuText“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),我们自己的测试程序, ”MenuStatusBar“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),, ”Exec“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),工具栏按钮, ”ButtonText“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),,, ”Icon“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),,, ”HotIcon“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),, ”Default Visible“, 0, REG_SZ, (const unsigned char *)((LPCSTR)type),代码中我们还用到了一个GetAppPath()函数,该函数将返回应用程序的路径,pathtemp,函数已经写好了,我们只要在程序适当的地方调用函数WriteReg()就可以了,例如在CTestView::PreCreateWindow()中。现在启动IE,你会发现IE中有三个地方已经有所不同了,如图4、图5、图6所示试试点击”MyTest“按钮或者”工具“菜单上的”MyTest“项看看,我们刚才编写的MyTest.exe是不是自动执行了?


那么上下文菜单怎样执行呢?从我们的程序中可以看出,我们是把它与一个。htm文件”MySelf.htm“相关联了,即点击上下文菜单中的”我们自己的上下文菜单“项,IE将会打开MYSelf.htm文件并执行其内容。

  现在让我们回想使用网络蚂蚁的情形:右击一个文件的URL,选择”Down by NetAnt“上下文菜单项,IE就会打开网络蚂蚁并开始下载。那么这个功能是怎么实现的呢?

  如果用过3721网址软件的话,它也会在IE的上下文菜单中添加自己的菜单”访问3721网站“,只要点击该菜单,就会打开浏览器,进入3721网站,这又是怎么实现的呢?

  其实,两种功能都是通过那个htm文件来实现的,只是那个htm文件的内容不一样罢了。下面我们就来揭开这层神秘的面纱。我们先看看3721中文网址,它相对比较简单。实现点击上下文菜单并打开一个固定的主页地址是很简单的,如果你对HTML语言和Script稍有了解的话,阅读下面MySelf.Htm的代码就会非常轻松当我们点击”我们自己的上下文菜单“的时候,IE就会自动打开清华大学的主页,非常简单的几句语句就解决大问题。事实上确实如此,有些问题没有认清本质的时候我们会觉得它很神奇,我们一旦弄清楚了,就觉得很简单了,是不是?

  下面要讲的是怎样实现网络蚂蚁的功能。不要误会,我们并不是要实现网络蚂蚁下载的功能,我们只是实现网络蚂蚁的启动功能,即通过点击”我们自己的上下文菜单“启动我们的Test程序而已。如果你对COM一点都不知道的话,最好先去看看这方面的书籍,下面的内容会简单一些。如果暂时不懂COM的话也没有关系,我会一步步讲的,只要按照我讲的步骤操作同样可以成功。

  首先我们建立一个很简单的COM组件。打开VC++开发环境并新建一个工程AddIEFun,Location选择”C:AddIEFun“,工程的类型是MFC AppWizard(dll),完毕以后点击OK按钮。在”Step 1 of 1“对话框中选中Automation(自动化)选项,因为要让组件支持脚本访问的话,必须要实现Automation.其它的接收默认选项。点击Finish按钮,新工程就建立好了。

  接下来的工作是添加一个COM对象类。虽然我们用AppWizard创建了应用框架,但是还没有真正的创建COM对象,按照下面的步骤为工程添加一个自动化对象选择菜单View->ClassWizard打开类向导。

  点击Add Class按钮,选择New命令。

  在弹出的New Class对话框的Name中输入类名CIEcontext,在Base class选择框中我们选择CCmdTarget,在对话框的下部我们选中Creatable by type ID,如图7所示。最后单击”OK“按钮,这样CIEcontext创建完成了,并且在类CIEcontext中实现了IIEcontext接口。

  下面我们要做的就是添加一个方法真正来实现这个接口,让它来完成打开Test.exe的功能,步骤如下打开ClassWizard.

  选中Automation选项页。

  在Class name字段中选中CIEcontext.

  单击Add Methord按钮,弹出Add Methord对话框。

  在External Name中输入AddContext,选择Return type类型为void,因为我们不需要返回什么特别的值,也不需要参数,所以在参数列表中也不需要添加参数。

  单击”OK“按钮,关闭Add Methord对话框。

  关键的一步就是要实现AddContext方法。因为我们要在脚本中访问该方法,而且只访问该方法就可以了,所以要添加的代码极其简单--只有一句代码,就是打开我们的程序Test.Exe,代码如下,现在对这个方法进行一些说明。该方法调用了WinExec()函数,目的是运行我们自己的程序。可以看出,该API有两个参数:一个是程序的完整路径和文件名,另一个参数是打开程序的方式。不过要说明一点,以这种绝对路径打开程序的方式不是很科学,实际应用中,事先应该把程序的路径写入注册表,然后在程序中读取注册表中的信息。

  我们的一个支持自动化的COM组件已经建成了,就这么简单。编译通过后,你会发现在工程的Debug目录下会产生两个特别的文件:AddIeFun.dll和AddIeFun.tlb,它们就是编译后产生的库文件。不过,要让用户能在程序中使用它们,首先必须对该组件进行注册。直接运行RegSvr32.Exe虽然简单,但是在VC++的集成环境中点击Tools菜单的Register Control更方便。注册成功的话,会弹出一个消息框,如图8所示现在,我们大部分任务已经完成了,剩下就是修改MySelf.htm文件,代码如下错误好了,现在你可以放心大胆的使用你的程序了!