⑴ 如何對webbrowser和IE編程
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 將被忽略.
(二)
調用 Navigate 方法比GoBack 以及GoForward 要困難,但如果你正僅僅導航到URL 且並不傳遞任何附加參數, 它的調用很容易。 舉例來說, VB中導航到 Microsoft 主頁, 可如下:
WebBrowser1.Navigate "http://www.microsoft.com"
VB代碼調用Navigate 如此容易因為所有參數出第一個參數外都可以是可選. 如此相對照,VC++不可以省略任何參數. 如果你想使用VC++不是勇任何特別的參數導航到 Microsoft的 home page, 你必須傳遞空的VARIANT結構。 MFC 應用程序,你必須如下調用 Navigate
COleVariant vtEmpty;
m_webBrowser.Navigate(_T("http://www.microsoft.com"), &vtEmpty, &vtEmpty,
&vtEmpty, &vtEmpty);
該例子展示了在MFC應用程序中控制WebBrowser控制項. 我傳遞一個普通的字元串而替代BSTR 因為 MFC 提供了一個 WebBrowser 控制項的包裝類,第一個載包裝類中是LPCTSTR, 一個普通的字元串. 其他參數為指向VARIANT 結構的指針。 如果你不想指定任何特別的參數, 別僅僅傳遞 NULL —那樣做, 你的應用程序會招來崩潰。你必須傳遞一個空的VARIANT結構的指針. 前面的代碼使用了 COleVariant 類, 那是一個與 CComVariant 類相似的類。 COleVariant 簡單包裝了 VARIANT 使得VARIANT 結構易於使用.