IE浏览器二次开发实用指南
IT商界
IE(Internet Explorer)浏览器提供了功能强大的二次开发接口,很多下载软件(网际快车和网络蚂蚁等)即利用了相应的接口,实现了在IE中的集成。开发者如能巧妙地利用这些接口,则完全可以充分发挥创造力,开发出形形色色的IE辅助软件。
一、IE右键菜单的开发
对于IE的右键菜单,我们并不陌生,很多下载软件都在右键菜单中新增了相应的菜单项。下面让我们利用IE提供的接口实现IE右键菜单的二次开发。
(一)相关知识点
1.添加右键菜单
添加右键菜单的方法很简单,在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt项下建立一个新项,该项名称即代表显示在IE右键菜单中的菜单项标题,如安装了网际快车或网络蚂蚁,那么在注册表编辑器中即可发现相应键值。
2.设置执行代码
添加了菜单项后,我们必须为菜单项设置单击后执行的代码。首先将新建注册表项的默认值设置为一个URL(Uniform Resource Locator,统一资源定位器)地址,当用户单击该菜单项后,IE将调用该URL所指向的脚本并执行其中的代码。我们分析相应键值即可发现网际快车和网络蚂蚁在单击IE右键菜单相应项时访问的文件。具体如下所述:
(1)“Download by NetAnts”项对应访问网络蚂蚁安装目录下的“NAGet.htm”文件。
(2)“Download &All by NetAnts”项对应访问网络蚂蚁安装目录下的“NAGetAll.htm”文件。
(3)“使用网际快车下载”项对应访问网际快车安装目录下的“jc_link.htm”文件。
(4)“使用网际快车下载全部链接”项对应访问网际快车安装目录下的“jc_all.htm”文件。
3.开发常用对象
在调用的目标脚本文件中,通过访问IE提供的一些右键开发专用对象,即可访问链接、图片、表单域或选择的文本等页面对象。具体如下所述:
(1)external对象:该对象允许程序处理由IE浏览器组件提供的附加对象。当其可用时,对象模型由IE浏览器的组件定义。通过external对象,可访问当前IE页面的各个控件,是IE右键菜单开发的关键。
(2)links对象:该对象属于Document对象,用于返回HTML页面所有超链接的集合,该对象的常用属性和方法如下所述:
length属性:该属性用于返回链接的数量。
href属性:该属性用于设置链接的目标。
innerText属性:该属性用于获取包含在HTML标记中的文字。
item方法:该方法用于访问指定的链接。
tags方法:该方法用于获取HTML的标记名称。
(3)images对象:该对象属于Document对象,用于返回HTML页面所有的图片集合,即包含在“<IMG>”标志中的图片文件,该对象的常用属性和方法如下所述:
src属性:该属性用于获取图片的地址。
alt属性:该属性用于获取图片的说明文字。
4.设置显示条件
有时,右键菜单需要在特定条件下显示,因此需在前述新建的注册项下再建立一个DWORD类型键,键名为Contexts,如未设置Contexts项,则新建的IE右键菜单项会在单击任何页面对象时出现。
通过Contexts项可设置菜单项在IE中右键单击时出现的对象,该值的取值范围如下表所示:
|
对象
|
值
|
对象
|
值
|
| 缺省 | 0x1 | 图片 | 0x2 |
| 控件 | 0x4 | 表单域 | 0x8 |
| 选择文本 | 0x10 | 锚点(超链接) | 0x20 |
Contexts项的值可为表1中的单个值或不同值的组合,如需要菜单项在用户单击图片或超级链接时出现,可将其值设置为“dword:00000022”(即0x20+0x2的运算值)。
(二)程序实例
当浏览包含大量链接的页面时,用户常常希望同时打开这些链接,而IE浏览器并未提供类似“在新窗口中打开所有链接”的菜单项,只能逐一手工打开。
我们可以在IE右键菜单项中添加“在新窗口中打开所有链接”菜单项。单击“在新窗口中打开所有链接”菜单项,将弹出一个显示链接数的确认对话框,单击“是”按钮后将对每一个链接新建IE窗口进行浏览。
在该例程中我们需要使用:
confirm方法:该方法用于显示确认对话框,并可获取用户的选择内容。
open方法:该方法用于新建IE窗体并打开指定的URL。
首先在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt下建立新项,命名为“在新窗口中打开所有链接”,其默认值为对应的脚本文件。然后在该项中建立一个DWORD键“Contexts”,值为0x35(即单击页面时显示该菜单项)。
在新建项对应的脚本文件中输入代码:
<script language="VBScript">
sub displink()
'获取页面全部链接
set links = external.menuArguments.document.links
'定义存放链接的数组
ReDim params(links.length*2)
'在确认框中显示链接数量
result=window.confirm("共有"+cstr(links.length)+"个链接,是否准备开新窗口打开?")
'如确认,则新建IE窗口并打开所有链接
if result=-1 then
for i = 0 to links.length-1
'调用open方法打开新窗口
result=window.open(links(i).href)
next
end if
end sub
call displink()
</script>
重启IE浏览器,访问包含多个链接的网页,单击该菜单项即可实现前述效果。
二、IE右键菜单开发进阶
虽然网际快车和网络蚂蚁在IE右键菜单中添加了相应的菜单项,但学习了前述的右键菜单基本开发后,完全可自行动手对其进行IE右键菜单的扩展开发,即结合脚本程序处理IE网页后调用这两个下载工具来实现各类特殊的下载功能,进一步增强IE右键菜单的功能。
(一)相关知识点
1.网际快车组件
(1)Netscape对象:该对象用于启动网络快车,类名为“JetCar.Netscape”。
(2)AddUrlList方法:批量添加下载地址。
(3)AddUrl:添加一个下载地址。
2.网络蚂蚁组件
(1)API对象:该对象用于启动网络蚂蚁。类名为“NetAnts.API”。
(2)AddUrlList方法:批量添加下载地址。
(3)AddUrl:添加一个下载地址。
3.添加下载地址的要点
网际快车和网络蚂蚁在批量添加下载地址时需注意,必需创建一个元素个数为下载链接数2倍加1的数组,然后数组的第一个元素需存放当前页面地址,其他元素如为奇数,则存放链接的网址,如为偶数,则存放链接的说明文字。
(二)程序实例
网际快车和网络蚂蚁在下载全部链接时均无法批量下载以“<IMG>”标记方式直接嵌入网页的图片,仅能使用下载单个链接的方法逐一下载,效率大为降低。本实例通过自行编制脚本程序实现了IE右键菜单的扩展开发,运行后对包含链接的网页进行下载全部链接操作时,其下载列表中不仅添加所有的链接,还可添加所有的页面图片,网际快车的效果如图1所示:
通过分析网际快车和网络蚂蚁所使用的脚本文件代码,可得出这两个软件无法下载网页内嵌图片的原因,具体如下所述:
(1)脚本均未对网页的图片对象进行相关操作。
(2)脚本仅对链接(links)对象进行了操作。
按前述知识,添加下载所有内嵌图片功能的步骤如下所述:
(1)获取网页的图像(images)对象。
(2)定义新的下载列表数组。
(3)遍历图像对象,按程序接口添加相关的网址和说明。
由于创建IE右键菜单项的步骤已经介绍,因此不做赘述,对应的脚本程序代码如下所示:
<script language="VBScript">
On Error Resume Next
set JetCarCatch=CreateObject("JetCar.Netscape")
if err<>0 then
MsgBox("FlashGet not properly installed!"+ vbCrLf+"Please Install FlashGet again")
else
set links = external.menuArguments.document.links
'将页面的所有图片赋予imgs变量
set imgs = external.menuArguments.document.images
'说明:按链接和图片的数量进行计算,并重定义数组
ReDim params(links.length*2+imgs.length*2)
j=links.length-1
k=imgs.length-1
params(0)=external.menuArguments.document.Url
for i = 0 to j
params(i*2+1)=links(i).href
params(i*2+2)=links(i).innerText
next
for j = 0 to k
'将奇数的数组元素赋值为图片的目标网址,为FlashGet的程序接口要求
params(j*2+1+i*2)=imgs(j).src
'将偶数的数组元素赋值为图片的说明文字,为FlashGet的程序接口要求
params(j*2+2+i*2)=imgs(j).alt
next
JetCarCatch.AddUrlList params
end if
</script>
三、IE工具栏按钮的开发
在安装了网际快车、网络蚂蚁和金山系列软件后,均会在IE工具栏或“工具”菜单中添加相应的按钮和菜单项。下面让我们利用IE提供的接口实现IE工具栏按钮的二次开发。
(一)相关知识点
添加IE任务栏按钮需对注册表进行多步操作,因此建议读者先备份注册表。通过对已有IE任务栏按钮的相应注册表项进行分析,得出修改注册表的基本步骤,具体如下所述:
1.创建GUID
在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Extensions\CmdMapping下建立一个GUID(Globally Unique IDentifier,全局唯一描述符)。
本例建立的DWORD值名称是“{FB5A1910-F110-11d2-BB9E-00C04F795683}”,其值为“0000200c”(值由NextId键值决定)。
建立完毕,在同一主键下有一个重要的键值需修改,即NextId。建议在修改前记录NextId值,在建立GUID需将该值递增1,如原NextId为“dword:00002009”,那么建立新GUID后,NextId值应修改为“dword:000020a”(按十六进制计算)。
2.创建注册表项
在注册表HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Extensions下添加一个新项,名称为刚才建立的GUID名称。
以下介绍的键位置,如未指定,均用“<Test IE GUID>”来代表(HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Extensions\<Test IE GUID>”)。
3.设置按钮图标
在<Test IE GUID>下新建一个String类型值,名称为“HotIcon”,该值代表当按钮获取焦点时的图标,一般包括图标文件全路径名和图标索引,如“C:\Program Files\Messenger\MSMSGS.EXE,302”,也可直接输入图标文件名。
在<Test IE GUID>下新建一个String类型值,名称为“Icon”,该值代表当按钮失去焦点时的图标,一般包括图标文件全路径名和图标索引,也可直接输入图标文件名。
IE工具栏按钮需20×20和16×16两种尺寸的图标,前者用于正常状态显示,后者用于全屏状态显示,因此上述HotIcon和Icon指向的图标资源应为三个图标的组合,这三个图标的规格如下表所示:
| 尺寸 | 颜色数 | 是否必需 | 尺寸 | 颜色数 | 是否必需 |
| 16×16 | 16色 | 是 | 20×20 | 16色 | 否 |
| 20×20 | 256色 | 是 |
4.设置提示内容
在<Test IE GUID>下建立一个新的字符串类型值,名称为“MenuText”,该值代表按钮在IE的“工具”菜单中显示的内容。
5.设置是否可视
在<Test IE GUID>下建立一个新的字符串类型值,名称为“Default Visible”,该值代表按钮是否可视,如可视,则该值设置为“Yes”,否则设置为“No”。
6.设置按钮ID
在<Test IE GUID>下建立一个新的字符串类型值,名称为“Clsid”,将该值设置为“{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}”,即系统默认的工具栏按钮ID。
7.设置代码文件
在<Test IE GUID>下建立一个新的字符串类型值,名称为“Script”,该值代表单击按钮后运行的脚本文件全路径名称。
对注册表操作较熟悉的读者,也可将前述添加IE按钮时的修改的注册表内容步骤导出,其内容如下所示:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\{FB5A1910-F110-11d2-BB9E-00C04F795683}]
"HotIcon"="C:\\Program Files\\Messenger\\MSMSGS.EXE,302"
"Icon"="C:\\Program Files\\Messenger\\MSMSGS.EXE,301"
"MenuText"="IE工具栏测试按钮"
"Default Visible"="Yes"
"Clsid"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"Script"="C:\\iecode\\toolbar.html"
读者可直接用文本编辑器修改导出的注册表文件来建立其他的IE工具栏按钮。当单击该按钮时会运行“script”键对应的脚本文件,该脚本文件和前述的脚本文件结构完全相同,即通过访问external对象的menuArguments属性获取页面,并进行相应的操作。
(二)程序实例
下面让我们来实现在IE任务栏中增加按钮效果。单击该按钮将弹出一个确认框,单击“确定”按钮,将使用对话框来显示当前IE页面的所有链接目标。
由于创建工具栏按钮的步骤已经介绍,因此不做赘述,按钮对应的脚本程序代码如下所示:
<script language="VBScript">
sub displink()
url=""
set links = external.menuArguments.document.links
ReDim params(links.length*2)
result=window.confirm(″共有″+cstr(links.length)+"个链接,准备浏览其链接目标吗?")
if result=-1 then
for i = 0 to links.length-1
url=url+links(i).href+chr(13)
next
window.alert(url)
end if
end sub
call displink()
</script>
四、IE浏览器的外接控制
IE除提供了内置的二次开发接口外,还提供了强大的COM组件接口,使开发者可通过其他开发工具来对IE进行外接控制。下面我们以VB6为开发平台,介绍调用IE的COM组件接口的操作。
(一)相关知识点
1.ShellUIHelper对象
ShellUIHelper对象是IE对象库中提供的成员,在开发前须在程序中加入对“Microsoft Internet Controls”类型库的引用。在VB6中可在“引用”对话框选择“Microsoft Internet Controls”类型库。
ImportExportFavorites方法用于对收藏夹进行操作,格式如下所述:
Sub ImportExportFavorites(fImport As Boolean, strImpExpPath As String)
其中fimport参数为Boolean型参数,用于设置导入或导出收藏夹,strImpExpPath参数为字符型参数,用于代表文件名。
2.ShellWindows对象
ShellWindows对象可换取所有打开的浏览器窗口名称,即返回了当前所有打开的浏览窗口对象集。在程序中随后可通过“For...Each”语句来遍历这些窗口。
ShellWindows对象返回的浏览窗口对象包含了IE和Explorer窗口(即资源管理器或“我的电脑”窗口),但IE浏览器的宿主程序为“Iexplore.exe”,而资源管理器或“我的电脑” 的宿主程序为“Explore.exe”,因此需对每一个对象按其FulName属性来判断是否为IE浏览器。
3.Document对象
Document对象代表了IE浏览器浏览的网页内容。由于一个HTML页面中可包含HEAD、TITLE和BODY等基本部分和Applet、脚本、链接和表单等内容,因此需循环遍历文档中的所有对象来辨别。如对象名称为“BODY”,那么该部分即为HTML的正文内容,然后访问其innerText属性即可获取文档正文。
(二)程序实例
IE使用一定时间后,在收藏夹中往往积累了大量的网址,在重装系统或计算机中存在多用户时,手工方式备份和恢复收藏夹非常麻烦。本例程通过利用IE对象库的ShellUIHelper对象,实现了导入和导出收藏夹内容的操作,运行效果如图2所示。
单击“导出收藏夹”,并单击“开始”按钮,将显示保存文件对话框,选择文件名后,即可将收藏夹以HTML的格式保存。选择“导入收藏夹”并单击“开始”按钮,可将已有的符合收藏夹格式的HTML文件导入收藏夹。
在VB6中新建工程,然后在窗体上放置一个按钮,一个通用对话框,一个Frame控件,并放置两个单选框,如图2所示。
按下表设置各控件属性(控件大小、位置读者可自行设置,其他为默认值)。
| 控件名称和类型 | 属性名称 | 属性值 | 备注 |
| Form1:Form | BorderStyle | 1 | Fixed/Single | Caption | IE收藏夹二次开发 | MaxButton | 0 | False |
| MinButton | 0 | False | |
| StartUpPosition | 2 | 屏幕中心 | |
| Frame1:Frame | Caption | 选择操作方式: | |
| OptExport:OptionButton | Caption | 导出收藏夹 | |
| Value | -1 | True | |
| OptImport:OptionButton | Caption | 导入收藏夹 | |
| CmdOK:CommandButton | Caption | 开始 |
然后输入代码,具体如下所述:
为判别操作状态,首先声明全局变量:
Dim Import As Boolean
定义对收藏夹进行操作的过程:
Private Sub ImportExportBookmark(fImport As Boolean)
Dim ObjSUH As SHDocVw.ShellUIHelper
Set ObjSUH = New SHDocVw.ShellUIHelper
If fImport = True Then
CDlgbm.DialogTitle = "请选择导入收藏夹的文件:"
On Error GoTo CancelHandler
CDlgbm.ShowOpen
Else
CDlgbm.DialogTitle = "请选择导出收藏夹的文件:"
On Error GoTo CancelHandler
CDlgbm.ShowSave
End If
ObjSUH.ImportExportFavorites fImport, CDlgbm.FileName
'在文件对话框中选择“取消”按钮
CancelHandler:
If Err.Number = cdlCancel Then Exit Sub
End Sub
在窗体Load事件中输入初始化操作的代码:
OptExport.Value = True
Import = False
CDlgbm.CancelError = True
在“开始”按钮的Click事件输入以下代码:
ImportExportBookmark (Import)
在“导出收藏夹”单选框的Click事件输入以下代码:
'设置为“导出”操作
Import = False
在“导入收藏夹”单选框的Click事件输入以下代码:
'设置为“导入”操作
Import = True
五、IE浏览器的程序控制
IE提供了Document对象和HTML对象库,可实现对网页中各类元素的分析操作。此外IE浏览器还提供了控件接口,使程序可内嵌IE浏览器,并可模拟键盘或鼠标实现交互,实现诸如自动上网获取信息等功能。
(一)相关知识点
1.IE浏览器控件
使用IE浏览器控件需在VB6中的“部件”窗体中添加“Microsoft Internet Controls”,随后在控件工具栏上将显示该控件的图标。该控件的常用属性和方法如下所述:
(1)AddressBar属性:该属性用于获取浏览器的地址栏对象。
(2)Busy属性:该属性返回浏览器是否正在打开网页。
(3)Document属性:该属性用于获取网页的内容。
(4)FullScreen属性:该属性返回浏览器是否处于全屏状态。
(5)LocationURL属性:该属性返回当前浏览的网址。
(6)Offline属性:该属性返回浏览器当前是否在线。
(7)All属性:该属性返回页面包含的所有对象。
(8)tagName:该属性返回指定对象的标记名称。
(9)getElementsByTagName方法:该方法用于获取指定标记的对象。
(10)Navigate方法:该方法用于控制浏览器访问指定的网址。
(11)Stop方法:该方法用于停止浏览当前页面。
2.HTML对象库
获取网页数据必须使用HTML对象库,可在“引用”窗体中添加对“Microsoft HTML Object Library”的引用。HTML对象库提供了大量的对象,这些对象和各类HTML标记相对应,如熟悉的“<a>”、“<Table>”、“<body>”和“<form>”标记,一些常用HTML对象的知识点如下所述:
(1)HTMLAnchorElement对象:该对象代表网页中超级链接(即“<a>”)标记,其常用属性和方法如下所述:
href属性:该属性用于设置链接的目标。
id属性:该属性用于设置链接的标识。
innerHTML属性:该属性返回链接的HTML代码。
innerText属性:该属性返回链接的文字。
target属性:该属性用于设置链接的方式。
click方法:该方法可模拟单击链接。
(2)HTMLBody对象:该对象代表网页中正文(即“<body>”)标记,其常用属性和方法如下所述:
background属性:该属性返回网页的背景图片。
bgColor属性:该属性返回网页的背景色。
innerText属性:该属性返回网页包含的所有文字。
(3)HTMLDocument对象:该对象包含网页的整体,如所有的链接、表格对象等,其常用属性和方法如下所述:
anchors属性:该属性返回网页包含的所有链接对象。
applets属性:该属性返回网页包含的Applet插件对象。
body属性:该属性返回网页的正文对象。
forms属性:该属性返回网页包含的所有表单对象。
frames属性:该属性返回网页包含的所有框架对象。
images属性:该属性返回网页包含的所有图片对象。
scripts属性:该属性返回网页包含的所有脚本对象。
(4)HTMLElementCollection对象:该对象可获取各类HTML对象的集合,如网页的表格或表单的集合,随后即可遍历该集合来选择所需的对象,其常用属性和方法如下所述:
length属性:该属性返回集合的成员数。
item方法:该属性返回集合中的指定成员。
(5)HTMLTable对象:该对象可获取HTML表格对象,也是获取网页信息的核心,其常用属性和方法如下所述:
cols属性:该属性返回表格的列数。
rows属性:该属性返回表格的行集合对象。
deleteRow方法:该方法用于删除表格行。
insertRow方法:该方法用于删除表格列。
(6)HTMLTableCell对象:该对象可获取HTML表格中的单元格对象(即“<TD>”标记中包含的内容),在控制表格对象后,需结合该对象来进一步获取所需的网页文字,其常用属性和方法如下所述:
cellIndex属性:该属性返回单元格的编号。
className属性:该属性返回单元格的类名。
colSpan属性:该属性返回单元格的列合并数。
innerHTML属性:该属性返回单元格的HTML代码。
innerText属性:该属性返回单元格包含的文字。
rowSpan属性:该属性返回单元格的行合并数。
vAlign属性:该属性返回单元格的垂直对齐方式。
(7)HTMLTableCol对象:该对象可获取HTML表格中的列对象,其常用属性和方法如下所述:
innerText属性:该属性返回表格列包含的文字。
span属性:该属性返回表格列的合并数。
(8)HTMLTableRow对象:该对象可获取HTML表格中的行对象(即“<TR>”标记中包含的内容),在控制表格对象后,需遍历表格行并在此基础上访问特定单元格对象来获取所需的网页文字。该对象的常用属性和方法如下所述:
cells属性:该属性返回行包含的单元格集合对象。
rowIndex属性:该属性返回行的编号。
vAlign属性:该属性返回行的垂直对齐方式。
3.页面控制的要点
在使用IE浏览器控件进行网页页面控制时,其核心事件为控件的DocumentComplete事件,仅在页面被完全调入后,程序才可进行数据处理。当触发DocumentComplete事件时,并非代表页面已全部调入。如页面不包含子框架,则发生DocumentComplete事件时代表页面已调入。如页面包含多个框架,则每个框架完成时均会触发DocumentComplete事件,当所有子框架均完成后,主框架产生DocumentComplete事件。因此为需判断每次事件发生时的对象是否为WebBrowser控件对象本身。
(二)程序实例
下面的例程实现网页数据的获取。结合前述知识,可得网页数据获取的步骤。由于针对不同网页有完全不同的代码,因此本文仅给出核心的思路和代码,具体如下所述:
(1)定义IHTMLElementCollection对象,获取网页包含的表格集合。
(2)调用getElementsByTagName方法获取指定的对象,示例代码如下所示:
Dim Tables As IHTMLElementCollection
'获取网页的表格对象
Set Tables = WebBrowser1.Document.getElementsByTagName("Table")
(3)由于网页一般包含多个表格,可通过HTMLTable对象进行处理,示例代码如下所示:
Dim Table1 As HTMLTable
For Each Table1 In Tables
'处理代码
Next
(4)HTMLTable对象的innerText属性可返回表格的全部文字信息,因此可按该信息判断所需数据的表格,也可通过手工分析网页源文件来获取。
(5)为逐行、列获取数据,还需使用HTMLTableRow和HTMLTableCell对象对表格行和单元格进行操作。
通过上面的讲述,相信你已掌握IE二次开发的基本方法与技巧了。其实在IE二次开发中还存在有相当多的高级方法,如利用COM组件在IE中的应用。COM组件以其可随时升级、重复使用、可扩展至网络开发和与开发语言平台无关等特点早已被开发者们津津乐道。下面我们给出COM组件在IE中的应用实例。
六、COM组件在IE中的应用
COM组件以其可随时升级、重复使用、可扩展至网络开发和与开发语言平台无关等特点早已被开发者们津津乐道,通过前面知识的学习,读者完全可结合COM组件技术和IE脚本技术实现更为强大的综合应用。下面将使用VB6开发COM组件,并通过IE右键菜单来创建组件实例,实现功能强大的IE辅助工具。
(一)相关知识点
1.Document对象
Document对象的一些属性在前述内容中已介绍,不过在页面元素分析时,还有一些常用的属性和集合,具体如下所述:
(1)URL属性:该属性返回当前网页的网址。
(2)scripts集合:该集合代表页面中的所有脚本。
(3)links集合:该集合代表页面中的所有超链接。
(4)images集合:该集合代表页面中的所有图片。
(5)forms集合:该集合代表页面中的所有表单。
(6)Action属性:该属性返回表单的提交目标网址。
(7)elements集合:该集合代表表单中包含的所有HTML控件,如INPUT(输入框)等。
(8)Type属性:该属性返回表单中HTML控件的类型。
2.调用COM组件
以VB为例,调用COM组件有二种方法,如下所述:
(1)通过New关键字创建:单击“工程”菜单的“引用”子菜单,在“引用”对话框中列出了可使用的引用类型,选择所需类型后,单击“确定”并切换至代码窗口。随后在代码窗口中可用“Dim”语句定义变量,在“As”关键字后,输入“New”关键字和空格,随后代码编辑器会提示可通过“New”关键字定义的对象。该方法使用较简单,但灵活性较差。
(2)通过函数创建:通过CreateObject 函数和GetObject 函数创建COM组件,且不需事先声明,灵活性较强,具体如下所述:
CreateObject 函数:该函数用于创建并返回一个COM对象实例。
GetObject 函数:该函数以关联的方式返回COM对象的引用。
(3)释放COM组件实例:如用户将CreateObject函数创建的COM组件实例赋予一个Object型变量, 那么可通过将该Object型变量赋予Nothing常量值来释放该COM组件实例。语法如下所示:
Set ComObject = Nothing
(二)程序实例
本实例综合运用了前述的相关知识。使用了VB6开发组件,该组件可通过IE右键菜单项激活,运行后以可视化的方式显示当前网页包含的各类资源(页面脚本、超链接、表单单元和图片),并可调用网际快车和网络蚂蚁进行相关资源的下载。IE右键新增菜单项如图3所示:
单击该菜单项将显示一个包含当前网页脚本、超链接、表单和图片资源的窗体,对于可下载的资源(如超链接和图片资源),将以复选列表框的形式供用户选择,并可调用网际快车和网络蚂蚁进行相关资源的下载,显示可下载资源的窗体效果如图4所示:
调用网际快车下载相关资源的界面如图5所示:
对于脚本和表单资源,该窗体将以文本框的形式显示其代码,如图6所示:
在VB6中创建COM非常方便,单击“文件”菜单的“新建工程”子菜单,在弹出的“新建工程”窗体中选择“ActiveX DLL”项,系统随后将自动添加一个COM组件的类模块。
在注册表的“HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt”下建立新项,命名为“资源分析”,值为对应的脚本文件。然后在该项中建立一个DWORD键“Contexts”,值为0xf3(即单击页面时显示该菜单项)。
在VB6中单击“文件”菜单的“新建工程”子菜单,在弹出的“新建工程”窗体中选择“ActiveX DLL”。系统将自动添加类模块,将该工程命名为“Websource”、将类模块命名为“WebClass”,随后添加一个窗体,命名为“Formweb”,此时的工程资源管理器如图7所示:
添加“Microsoft Tabbed Dialog Control 6.0”控件,然后在窗体上放置一个SSTab控件并新建二个选项卡,二个按钮控件,二个单选框控件,二个列表框控件,二个文本框控件和二个标签控件,如图8和图9所示:
按下表设置各控件属性(控件大小、位置读者可自行设置),其他为默认值。
|
控件名称和类型
|
属性名称
|
属 性 值
|
备 注
|
| Formweb:Form | BorderStyle | 3 | Fixed Dialog |
| Caption | HTML资源分析 | ||
| MaxButton | 0 | False | |
| MinButton | 0 | False | |
| StartUpPosition | 2 | 屏幕中心 | |
| SSTab1:SSTab | Tabs | 2 | |
| Tab | 1 | ||
| TabsPerRow | 2 | ||
| TabCaption(0) | 脚本代码及窗体控件 | ||
| TabCaption(1) | 图片及链接 | ||
| cmdflashget :CommandButton | Caption | 使用网际快车下载 | |
| cmdnetant :CommandButton | Caption | 使用网络蚂蚁下载 | |
| Option2 :OptionButton | Caption | 链接 | |
| Option1 :OptionButton | Caption | 图片 | |
| Lstlink :ListBox | Style | 1 | Checkbox |
| lstimage :ListBox | Style | 1 | Checkbox |
| txtform :TextBox | MultiLine | -1 | True |
| ScrollBars | 3 | Both | |
| txtscript :TextBox | MultiLine | -1 | True |
| ScrollBars | 3 | Both | |
| Label2 :Label | Caption | 窗体控件: | |
| Label1 :Label | Caption | 脚本代码: |
输入窗体的程序代码,首先定义全局变量,代码如下所示:
Public strurl As String '存放网址的变量
输入各控件事件和自定义过程代码,如下所示:
'使用网际快车下载图片的过程
Sub useflashdownpic()
On Error Resume Next
Dim JetCarCatch As Object
Dim i, j As Integer
'创建网际快车对象
Set JetCarCatch = CreateObject("JetCar.Netscape")
If Err <> 0 Then
MsgBox "未正确安装网际快车!"
Else
'遍历列表框,获取选择的图片
j = 0
For i = 0 To lstimage.ListCount - 1
If lstimage.Selected(i) = True Then
j = j + 1
End If
Next i
ReDim params(j * 2)
params(0) = strurl
j = 0
For i = 0 To lstimage.ListCount - 1
If lstimage.Selected(i) = True Then
params(j * 2 + 1) = lstimage.List(i)
params(j * 2 + 2) = "图片"
j = j + 1
End If
Next I
'调用网际快车进行下载
JetCarCatch.AddUrlList params
End If
End Sub
'使用网络蚂蚁下载图片的过程
Sub useantdownpic()
On Error Resume Next
Dim NetAntsApi As Object
Dim i, j As Integer
'创建网络蚂蚁对象
Set NetAntsApi = CreateObject("NetAnts.API")
If Err <> 0 Then
MsgBox "未正确安装网络蚂蚁!"
Else
'遍历列表框,获取选择的图片
j = 0
For i = 0 To lstimage.ListCount - 1
If lstimage.Selected(i) = True Then
j = j + 1
End If
Next i
ReDim params(j * 2)
params(0) = strurl
j = 0
For i = 0 To lstimage.ListCount - 1
If lstimage.Selected(i) = True Then
params(j * 2 + 1) = lstimage.List(i)
params(j * 2 + 2) = "图片"
j = j + 1
End If
Next I
'调用网络蚂蚁进行下载
NetAntsApi.AddUrlList params
End If
End Sub
'使用网际快车下载链接的过程
Sub useflashdownlink()
On Error Resume Next
Dim JetCarCatch As Object
Dim i, j As Integer
Set JetCarCatch = CreateObject("JetCar.Netscape")
If Err <> 0 Then
MsgBox "未正确安装网际快车!"
Else
j = 0
For i = 0 To lstlink.ListCount - 1
If lstlink.Selected(i) = True Then
j = j + 1
End If
Next i
ReDim params(j * 2)
params(0) = strurl
j = 0
For i = 0 To lstlink.ListCount - 1
If lstlink.Selected(i) = True Then
params(j * 2 + 1) = lstlink.List(i)
params(j * 2 + 2) = "链接"
j = j + 1
End If
Next i
JetCarCatch.AddUrlList params
End If
End Sub
'使用网络蚂蚁下载链接的过程
Sub useantdownlink()
On Error Resume Next
Dim NetAntsApi As Object
Dim i, j As Integer
Set NetAntsApi = CreateObject("NetAnts.API")
If Err <> 0 Then
MsgBox "未正确安装网络蚂蚁!"
Else
j = 0
For i = 0 To lstlink.ListCount - 1
If lstlink.Selected(i) = True Then
j = j + 1
End If
Next i
ReDim params(j * 2)
params(0) = strurl
j = 0
For i = 0 To lstlink.ListCount - 1
If lstlink.Selected(i) = True Then
params(j * 2 + 1) = lstlink.List(i)
params(j * 2 + 2) = "链接"
j = j + 1
End If
Next i
NetAntsApi.AddUrlList params
End If
End Sub
'“使用网际快车下载”按钮单击事件过程
Private Sub cmdflashget_Click()
On Error Resume Next
If Option1.Value = True Then
Call useflashdownpic
Else
Call useflashdownlink
End If
End Sub
'“使用网络蚂蚁下载”按钮单击事件过程
Private Sub cmdnetant_Click()
On Error Resume Next
If Option1.Value = True Then
Call useantdownpic
Else
Call useantdownlink
End If
End Sub
窗体代码输入完毕后,在工程资源管理器中切换至类模块并输入代码。由于类模块包含的过程一般需供外部程序调用,因此均定义为“Public”类型。按程序的功能要求,可得该类模块的方法设计,如下所述:
a、显示窗体的方法。
b、添加网址的方法。
c、添加脚本、链接和图片的方法。
d、添加表单和相关控件的方法。
按类模块方法设计编制代码,如下所示:
'类的初始化事件
Private Sub Class_Initialize()
'装载但不显示窗体
Load Formweb
End Sub
'显示窗体的过程
Public Sub showform()
Formweb.Show 1
End Sub
'添加网址的过程
Public Sub addurl(ByVal url As String)
'将网址传递至窗体的全局变量
Formweb.strurl = url
End Sub
'添加脚本的过程
Public Sub addscript(ByVal script As String)
Formweb.txtscript.SelText = script + vbCrLf
End Sub
'添加链接的过程
Public Sub addlink(ByVal link As String)
Dim j As Integer
Dim same As Boolean
same = False
'遍历窗体的列表框,以免重复添加
With Formweb
For j = 0 To .lstlink.ListCount - 1
If .lstlink.List(j) = link Then
same = True
Exit For
End If
Next j
If same = False Then
.lstlink.AddItem link
.lstlink.Selected(.lstlink.NewIndex) = True
End If
End With
End Sub
'添加图片的过程
Public Sub addimg(ByVal img As String)
Dim j As Integer
Dim same As Boolean
same = False
'遍历窗体的列表框,以免重复添加
With Formweb
For j = 0 To .lstimage.ListCount - 1
If .lstimage.List(j) = img Then
same = True
Exit For
End If
Next j
If same = False Then
.lstimage.AddItem img
.lstimage.Selected(.lstimage.NewIndex) = True
End If
End With
End Sub
'添加表单的过程,该过程先传递表单名称和提交目标
Public Sub addform(ByVal fm As String, ByVal action As String)
With Formweb
.txtform.SelText = "名称:" + fm + vbCrLf
.txtform.SelText = "提交目标:" + action + vbCrLf
End With
End Sub
'添加表单控件的过程,该过程传递控件名称和类型
Public Sub addelement(ByVal con As String, ByVal tp As String)
With Formweb
.txtform.SelText = Chr(9) + "控件名称:" + con + vbCrLf
.txtform.SelText = Chr(9) + "类型:" + tp + vbCrLf
End With
End Sub
代码输入无误后,保存整个工程,单击“工具”菜单的“发布”子菜单的“建立输出”菜单,将显示“发布向导”窗体,读者可按向导逐步完成COM组件的注册,注册后的组件即可通过前述方法进行调用。
在前述步骤中新建的注册表项对应的脚本文件中输入代码,如下所示:
<script language="VBScript">
On Error Resume Next
'创建新建的COM组件实例
set websource=CreateObject("Websource.WebClass")
if err<>0 then
MsgBox("出现错误,未正确安装组件!")
else
'调用组件添加网址的方法
websource.addurl external.menuArguments.document.URL
'获取页面的脚本集合
set scripts = external.menuArguments.document.scripts
'遍历并调用组件添加脚本的方法
For i = 0 To scripts.length-1
websource.addscript scripts(i).Text
Next
'获取页面的超链接集合
set links = external.menuArguments.document.links
'遍历并调用组件添加超链接的方法
For i = 0 To links.length - 1
websource.addlink links(i).href
next
'获取页面的图片集合
set imgs = external.menuArguments.document.images
'遍历并调用组件添加图片的方法
For i = 0 To imgs.length - 1
websource.addimg imgs(i).src
next
'获取页面的表单集合
set forms = external.menuArguments.document.Forms
'遍历并调用组件添加表单的方法
For i = 0 To forms.length - 1
websource.addform forms(i).Name,forms(i).Action
set tmpform=forms(i)
'获取表单的控件集合
set elements=tmpform.elements
'遍历并调用组件添加表单控件的方法
For j = 0 To elements.length - 1
websource.addelement elements(j).Name,elements(j).Type
Next
Next
'显示组件包含的窗体
websource.showform
end if
</script>








