實(shí)現(xiàn)和IE瀏覽器交互的幾種方法的介紹

字號(hào):

1.引言
    如何實(shí)現(xiàn)對(duì)IE瀏覽器中對(duì)象的操作是一個(gè)很有實(shí)際意義問題,通過和IE綁定的DLL我們可以記錄IE瀏覽過的網(wǎng)頁的順序,分析用戶的使用行為和模式。我們可以對(duì)網(wǎng)頁的內(nèi)容進(jìn)行過濾和翻譯,可以自動(dòng)填寫網(wǎng)頁中經(jīng)常需要用戶填寫的Form內(nèi)容等等,我們所有的例子代碼都是通過VC來表示的,采用的原理是通過和IE對(duì)象的接口的交互來實(shí)現(xiàn)對(duì)IE的訪問。實(shí)際上是采用COM的技術(shù),我們知道COM是和語言無關(guān)的一種二進(jìn)制對(duì)象交互的模式,所以實(shí)際上我們下面所描述的內(nèi)容都可以用其他的語言來實(shí)現(xiàn),比如VB,DELPHI,C++ Builder等等。
    2.IE實(shí)例遍歷實(shí)現(xiàn)
    首先我們來看系統(tǒng)是如何知道當(dāng)前有多少個(gè)IE的實(shí)例在運(yùn)行。
    我們知道在Windows體系結(jié)構(gòu)下,一個(gè)應(yīng)用程序可以通過操作系統(tǒng)的運(yùn)行對(duì)象表來和這些應(yīng)用的實(shí)例進(jìn)行交互。但是IE當(dāng)前的實(shí)現(xiàn)機(jī)制是不在運(yùn)行對(duì)象表中進(jìn)行注冊(cè),所以需要采用其他的方法。我們知道可以通過ShellWindows集合來代表屬于shell的當(dāng)前打開的窗口的集合,而IE就是屬于shell的一個(gè)應(yīng)用程序。
    下面我們描述一下用VC實(shí)現(xiàn)對(duì)當(dāng)前 IE實(shí)例的進(jìn)行遍歷的方法。IShellWindows是關(guān)于系統(tǒng)shell的一個(gè)接口,我們可以定義一個(gè)如下的接口變量:
    SHDocVw::IShellWindowsPtr m_spSHWinds;
    然后創(chuàng)建變量的實(shí)例:
    m_spSHWinds.CreateInstance
    (__uuidof(SHDocVw::ShellWindows));
    通過IShellWindows接口的方法GetCount
    可以得到當(dāng)前實(shí)例的數(shù)目:
    long nCount = m_spSHWinds- >GetCount();
    通過IShellWindows接口的方法Item
    可以得到每一個(gè)實(shí)例對(duì)象
    IDispatchPtr spDisp;
    _variant_t va(i, VT_I4);
    spDisp = m_spSHWinds->Item(va);
    然后我們可以判斷實(shí)例對(duì)象是不是
    屬于IE瀏覽器對(duì)象,通過下面的語句實(shí)現(xiàn):
    SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
    assert(spBrowser != NULL)
    在得到了IE瀏覽器對(duì)象以后,我們可以調(diào)用IWebBrowser2Ptr接口的方法來得到當(dāng)前的文檔對(duì)象的指針: MSHTML::IHTMLDocument2Ptr spDoc(spBrowser->GetDocument());
    然后我們就可以通過這個(gè)接口對(duì)這個(gè)文檔對(duì)象進(jìn)行操作,比如通過Gettitle得到文檔的標(biāo)題。
    我們?cè)跒g覽網(wǎng)絡(luò)的時(shí)候,一般總會(huì)同時(shí)開很多IE的實(shí)例,如果這些頁面都是很好的話,我們可能想保存在硬盤上,這樣,我們需要對(duì)每一個(gè)實(shí)例進(jìn)行保存,而如果我們采用上面的原理,我們可以得到每一個(gè)IE的實(shí)例及其網(wǎng)頁對(duì)象的接口,這樣就可以通過一個(gè)簡(jiǎn)單的程序來批量的保存當(dāng)前的所有打開的網(wǎng)頁。采用上面介紹的方法實(shí)現(xiàn)了對(duì)當(dāng)前IE實(shí)例的遍歷,但是我們希望得到每一個(gè)IE實(shí)例所產(chǎn)生的事件,這就需要通過DLL的機(jī)制來實(shí)現(xiàn)。