(IE 工业工程)IE 浏览器二次开发实用指南
(IE 工业工程)IE 浏览器二次开发实用指南
IE 浏览器二次开发实用指南
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
导出收藏夹
v alue
-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.v alue = 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.v alue = True Then
Call useflashdownpic
Else
Call useflashdownlink
End If
End Sub
"“使用网络蚂蚁下载”按钮单击事件过程
Private Sub cmdnetant_Click()
On Error Resume Next
If Option1.v alue = 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
相关热词搜索: 工业工程 浏览器 实用