一、
因为工作缘故,需要研究对 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中你可以如下调用:
InternetExplorer1.GoForward ' Automating Internet Explorer object
VC++中如下:
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 将被忽略 .