一、
因為工作緣故,需要研究對
IE
編程,所以翻譯了
MS
的有關(guān)資料,供參考。
IE
的體系
WebBrowser Host
首先,必須有
COM
的基礎(chǔ)知識,因為
IE
本身就是
COM
技術(shù)的典型應(yīng)用。我們看到最上層是
WebBrowser
的宿主(
Host
),也就是任何你想重用
(ReUse)webbrowser control
的應(yīng)用程序,可以是
vb
程序,也可以是
vc
或者任何其他語言的應(yīng)用程序。應(yīng)用程序必須是可容納
activex
控件的容器。
Webbrowser control
既是
activex control
也是
activex document
的宿主。作為控件,它可以置于任何
activex
容器,作為文檔容器,它針對特殊的類型,調(diào)用特殊類型注冊的文檔
server
以顯示文檔。如果你想顯示一個
.doc
文檔,
webbrowser control
裝載
windows word,
,對于
html
文檔,
webbrowser
裝載名為
mshtml
的組件
(
如圖所示
)
。針對不同的文檔,你不需要開發(fā)不同的應(yīng)用,僅僅是調(diào)用
webbrowser control
即可。
Shdocvw
Shdocvw.dll
包含了
webbrowser control
,控制
webbrowser control (
就像控制其他任何
activex com
控件一樣
)
,提供瀏覽能力給上層宿主。請注意
webbrowser control
位于第二級中。甚至
IE
也不直接而是通過
shdocw.dll
來使用
webbrowser control
的。盡管
shdocvw
提供了大部分的瀏覽功能,但是并不提供
IE
窗口的呈現(xiàn)功能。盡管如此,
shdocvw
還是提供了簡單創(chuàng)建
web
應(yīng)用程序的能力。之后章節(jié)會講到如何將
ie
的高級特性加入到你的應(yīng)用程序。
MSHTML
早期的
mshtml
具有讀取顯示
html
的功能。
MSHTML
實際上是一個
active
文檔服務(wù)器,但是卻可以作為其他控件的容器(如圖中所示的)。記得嗎,你可以將
activex
控件置于
html
中,此時
mshtml
就是一個
activex
宿主,還可以控制其他的控件如
vbscript
腳本引擎和
javascript
腳本引擎,
java applet ,geszhong
,各種插件
—
別意外,
plug-in
都是按照
ie activex
規(guī)范寫的。
二、
WebBrowser Control
與
Internet Explorer
二者又太多的共同點,你都是通過
COM
接口來訪問其功能。當(dāng)調(diào)用
webbrowser
控件時,使用的是
webbrowser
對象,在
vc
中是使用
class ID CLSID_WebBrowser
的接口類。
當(dāng)自動化
ie
時,必須建立名為
InternetExplorer
的對象,
vc
等語言中使用名為
class ID CLSID_InternetExplorer
的接口類。

接口
webbrowser
有
4
個接口(如圖),其中
3
個提供全部的功能,第
4
個
DWebBrowserEvents2
接口暴露事件
ie4
之前,僅有
IwebBrowser
和
IwebBrowserApp
兩個接口,且二者共享相同的功能,當(dāng)開發(fā)
ie4
時候,決定加入第三個接口
IWebBrowser2
擴(kuò)展
webbrowser
的功能。該接口派生于第二個接口。
IWebBrowser
IWebBrowser
僅僅是
WebBrowser control
的最初接口,
提供基本的例如導(dǎo)航
web
頁面的功能。
作為其他派生接口的基礎(chǔ)接口,有
8
個方法和
30
個屬性。
方法
|
描述
|
GoBack
|
導(dǎo)航到歷史列表中的上一個頁面
|
GoForward
|
導(dǎo)航到歷史歷表中的下一個項目
|
GoHome
|
導(dǎo)航到缺省頁面
.
|
GoSearch
|
導(dǎo)航到缺省搜索頁面
|
Navigate
|
導(dǎo)航到一個頁面或者頁面
|
Refresh
|
刷新當(dāng)前頁面
|
Refresh2
|
可以選擇刷新級別,如下:
|
|
REFRESH_NORMAL
普通刷新,并且不發(fā)送
HTTP pragma:nocache
到服務(wù)器
.
|
|
REFRESH_IFEXPIRED
僅僅當(dāng)頁面失效時才發(fā)送刷新請求
|
|
REFRESH_CONTINUE
內(nèi)部使用,不要在編程時使用
|
|
REFRESH_COMPLETELY
發(fā)送
HTTP pragma:nocache header
到服務(wù)器
|
Stop
|
停止當(dāng)前導(dǎo)航
|
盡管WebBrowser control 提供了你需要的導(dǎo)航回退以及前向的方法,但是沒有提供存取歷史列表的途徑. 你可與直接通過屬性LocationUR來獲取當(dāng)前頁的URL.
在VB或者VC++中調(diào)用GoBack 和 GoForward 方法式很容易的.你可以使用WebBrowser control 或者 Internet Explorer對象. 舉例來講, 在VB中你可以如下調(diào)用:
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 方法十分重要,當(dāng)控制WebBrowser control或者自動化操作 Internet Explorer, Navigate is 卻是最重要的方法. Navigate 允許你導(dǎo)航到特定的你所想的web頁或者文件. Navigate 帶有5個參數(shù), 允許你指定特定的URL以實現(xiàn)導(dǎo)航以及其他定義導(dǎo)航行為的信息.
第一個參數(shù)是 URL, 指示web頁的位置和名稱或者何處的文件你想裝載。 (次擦?xí)愋褪?BSTR.) URL 可以是你所使用的標(biāo)準(zhǔn)URL 協(xié)議類型的一種,例如HTTP 和 FILE, 或者是全路經(jīng)文件名的本地文件系統(tǒng), 例如 C:\MyFile.htm.
第二個參數(shù), Flags, 你可指定如何或者甚至何處裝載特定的URL. (參數(shù)的類型是指向 VARIANT的指針) Flags 的值來自名為 BrowserNavConstants 的枚舉類型 ,定義于 ExDisp.h 頭文件中且有6個值, 詳細(xì)解釋見下列表. 你可以指定一個或者多個Flags 參數(shù)值 (請留意有些當(dāng)前并未實現(xiàn)).
·
navOpenInNewWindow
. 將導(dǎo)致一個新的窗口打開以顯示URL. 缺省,如果你在自己的應(yīng)用程序中控制 WebBrowser control,這些值將導(dǎo)致新的 Internet Explorer 瀏覽器窗口打開.
-
navNoHistory
.
指定此
URL
將不加入到
URL
歷史列表中
-
navNoReadFromCache
.
當(dāng)前未實現(xiàn)
.
-
navNoWriteToCache
.
當(dāng)前未實現(xiàn)
.
-
navAllowAutoSearch
.
如果指定的
URL
未找到,自動搜索功能將試圖導(dǎo)航到通常的頂級域名如
.com .net .org
以找到正確的
URL
。如果失敗,
URL
將傳遞給搜索引擎
.
-
navBrowserBar
.
如果可能,將
URL
裝入到
Explorer
的地址欄
Bar
。
第三個參數(shù) TargetFrameName. 指定web頁的哪一個frame將會發(fā)生導(dǎo)航. (參數(shù)的類型是指向 VARIANT的指針)此字符串將為以存在于web頁中的名字或者一個指定的值如 _top 或 _search. _top 值指定 URL 將被當(dāng)前最頂層web頁裝入并不在任何一個當(dāng)前頁中存在的frame. _search 指示搜索面板將被打開. (該值僅在你自動化操控Internet Explorer時發(fā)生.) 如果你指定的frame名稱并未發(fā)現(xiàn),, 新的Internet Explorer 窗口將被打開。
你可以使用 PostData 參數(shù) (第四個)通過HTTPpost事務(wù)將指定特定的數(shù)據(jù)發(fā)送到服務(wù)器. (參數(shù)的類型是指向 VARIANT的指針) Post 處理用于將在HTML表單收集的數(shù)據(jù)發(fā)送到服務(wù)器。如果此參數(shù)不指定任何數(shù)據(jù) , Navigate 方法將使用Get方法. 另外,如果你不指定 HTTP 協(xié)議的URL (換句話講,如果你指定例如 FILE 協(xié)議的 URL), PostData 參數(shù)將被忽略。
你也可以使用第五個參數(shù)
, Headers,
以發(fā)送
HTTP
頭信息到服務(wù)器
. (T
參數(shù)的類型是指向
VARIANT
的指針
)
這些加入的頭信息將被
WebBrowser
控件如常發(fā)送出去
.
作為
PostData
參數(shù)
,
如果你并不指定第一個參數(shù)
, Headers
將被忽略
.