一、
因为工作缘故,需要研究对
IE
编程,所以翻译了
MS
的有关资料,供参考。
IE
的体系
WebBrowser Host
首先,必须有
COM
的基础知识,因为
IE
本身就是
COM
技术的典型应用。我们看到最上层是
WebBrowser
的宿主(
Host
),也就是任何你想重用
(ReUse)webbrowser control
的应用程序,可以是
vb
程序,也可以是
vc
或者任何其他语言的应用程序。应用程序必须是可容纳
activex
控件的容器。
Webbrowser control
既是
activex control
也是
activex document
的宿主。作为控件,它可以置于任何
activex
容器,作为文档容器,它针对特殊的类型,调用特殊类型注册的文档
server
以显示文档。如果你想显示一个
.doc
文档,
webbrowser control
装载
windows word,
,对于
html
文档,
webbrowser
装载名为
mshtml
的组件
(
如图所示
)
。针对不同的文档,你不需要开发不同的应用,仅仅是调用
webbrowser control
即可。
Shdocvw
Shdocvw.dll
包含了
webbrowser control
,控制
webbrowser control (
就像控制其他任何
activex com
控件一样
)
,提供浏览能力给上层宿主。请注意
webbrowser control
位于第二级中。甚至
IE
也不直接而是通过
shdocw.dll
来使用
webbrowser control
的。尽管
shdocvw
提供了大部分的浏览功能,但是并不提供
IE
窗口的呈现功能。尽管如此,
shdocvw
还是提供了简单创建
web
应用程序的能力。之后章节会讲到如何将
ie
的高级特性加入到你的应用程序。
MSHTML
早期的
mshtml
具有读取显示
html
的功能。
MSHTML
实际上是一个
active
文档服务器,但是却可以作为其他控件的容器(如图中所示的)。记得吗,你可以将
activex
控件置于
html
中,此时
mshtml
就是一个
activex
宿主,还可以控制其他的控件如
vbscript
脚本引擎和
javascript
脚本引擎,
java applet ,geszhong
,各种插件
—
别意外,
plug-in
都是按照
ie activex
规范写的。
二、
WebBrowser Control
与
Internet Explorer
二者又太多的共同点,你都是通过
COM
接口来访问其功能。当调用
webbrowser
控件时,使用的是
webbrowser
对象,在
vc
中是使用
class ID CLSID_WebBrowser
的接口类。
当自动化
ie
时,必须建立名为
InternetExplorer
的对象,
vc
等语言中使用名为
class ID CLSID_InternetExplorer
的接口类。
接口
webbrowser
有
4
个接口(如图),其中
3
个提供全部的功能,第
4
个
DWebBrowserEvents2
接口暴露事件
ie4
之前,仅有
IwebBrowser
和
IwebBrowserApp
两个接口,且二者共享相同的功能,当开发
ie4
时候,决定加入第三个接口
IWebBrowser2
扩展
webbrowser
的功能。该接口派生于第二个接口。
IWebBrowser
IWebBrowser
仅仅是
WebBrowser control
的最初接口,
提供基本的例如导航
web
页面的功能。
作为其他派生接口的基础接口,有
8
个方法和
30
个属性。
方法
|
描述
|
GoBack
|
导航到历史列表中的上一个页面
|
GoForward
|
导航到历史历表中的下一个项目
|
GoHome
|
导航到缺省页面
.
|
GoSearch
|
导航到缺省搜索页面
|
Navigate
|
导航到一个页面或者页面
|
Refresh
|
刷新当前页面
|
Refresh2
|
可以选择刷新级别,如下:
|
|
REFRESH_NORMAL
普通刷新,并且不发送
HTTP pragma:nocache
到服务器
.
|
|
REFRESH_IFEXPIRED
仅仅当页面失效时才发送刷新请求
|
|
REFRESH_CONTINUE
内部使用,不要在编程时使用
|
|
REFRESH_COMPLETELY
发送
HTTP pragma:nocache header
到服务器
|
Stop
|
停止当前导航
|
尽管WebBrowser control 提供了你需要的导航回退以及前向的方法,但是没有提供存取历史列表的途径. 你可与直接通过属性LocationUR来获取当前页的URL.
在VB或者VC++中调用GoBack 和 GoForward 方法式很容易的.你可以使用WebBrowser control 或者 Internet Explorer对象. 举例来讲, 在VB中你可以如下调用:
WebBrowser1.GoBack ' Hosting WebBrowser control
InternetExplorer1.GoForward ' Automating Internet Explorer object
VC++中如下:
m_webBrowser.GoBack(); // Hosting WebBrowser control
m_pInternetExplorer->GoForward(); // Automating Internet Explorer object
尽管 GoBack 和 GoForward 方法十分重要,当控制WebBrowser control或者自动化操作 Internet Explorer, Navigate is 却是最重要的方法. Navigate 允许你导航到特定的你所想的web页或者文件. Navigate 带有5个参数, 允许你指定特定的URL以实现导航以及其他定义导航行为的信息.
第一个参数是 URL, 指示web页的位置和名称或者何处的文件你想装载。 (次擦书类型是 BSTR.) URL 可以是你所使用的标准URL 协议类型的一种,例如HTTP 和 FILE, 或者是全路经文件名的本地文件系统, 例如 C:\MyFile.htm.
第二个参数, Flags, 你可指定如何或者甚至何处装载特定的URL. (参数的类型是指向 VARIANT的指针) Flags 的值来自名为 BrowserNavConstants 的枚举类型 ,定义于 ExDisp.h 头文件中且有6个值, 详细解释见下列表. 你可以指定一个或者多个Flags 参数值 (请留意有些当前并未实现).
·
navOpenInNewWindow
. 将导致一个新的窗口打开以显示URL. 缺省,如果你在自己的应用程序中控制 WebBrowser control,这些值将导致新的 Internet Explorer 浏览器窗口打开.
-
navNoHistory
.
指定此
URL
将不加入到
URL
历史列表中
-
navNoReadFromCache
.
当前未实现
.
-
navNoWriteToCache
.
当前未实现
.
-
navAllowAutoSearch
.
如果指定的
URL
未找到,自动搜索功能将试图导航到通常的顶级域名如
.com .net .org
以找到正确的
URL
。如果失败,
URL
将传递给搜索引擎
.
-
navBrowserBar
.
如果可能,将
URL
装入到
Explorer
的地址栏
Bar
。
第三个参数 TargetFrameName. 指定web页的哪一个frame将会发生导航. (参数的类型是指向 VARIANT的指针)此字符串将为以存在于web页中的名字或者一个指定的值如 _top 或 _search. _top 值指定 URL 将被当前最顶层web页装入并不在任何一个当前页中存在的frame. _search 指示搜索面板将被打开. (该值仅在你自动化操控Internet Explorer时发生.) 如果你指定的frame名称并未发现,, 新的Internet Explorer 窗口将被打开。
你可以使用 PostData 参数 (第四个)通过HTTPpost事务将指定特定的数据发送到服务器. (参数的类型是指向 VARIANT的指针) Post 处理用于将在HTML表单收集的数据发送到服务器。如果此参数不指定任何数据 , Navigate 方法将使用Get方法. 另外,如果你不指定 HTTP 协议的URL (换句话讲,如果你指定例如 FILE 协议的 URL), PostData 参数将被忽略。
你也可以使用第五个参数
, Headers,
以发送
HTTP
头信息到服务器
. (T
参数的类型是指向
VARIANT
的指针
)
这些加入的头信息将被
WebBrowser
控件如常发送出去
.
作为
PostData
参数
,
如果你并不指定第一个参数
, Headers
将被忽略
.