色吊丝最新资源-第一福利在线视频-欧美久久久-欧产日产国产精品v原神 |www.phbaer.net

來古計算機 > C++ > 正文

瀏覽器輔助對象BHO網址監控插件的實現

 

BHO(Browser Helper Object,瀏覽器輔助對象,簡稱BHO)。BHO是微軟推出的作為瀏覽器對第三方程序員開放交互接口的業界標準,通過簡單的代碼就可以進入瀏覽器領域的“交互接口”(INTERACTIVED Interface)。通過這個接口,程序員可以編寫代碼獲取瀏覽器的行為,比如“后退”、“前進”、“當前頁面”等,利用BHO的交互特性,程序員還可以用代碼控制瀏覽器行為,比如修改替換瀏覽器工具欄,添加自己的程序按鈕等。這些在系統看來都是沒有問題的。BHO原來的目的是為了更好的幫助程序員打造個性化瀏覽器,以及為程序提供更簡潔的交互功能,現在很多IE個性化工具就是利用BHO的來實現。

在正式利用VC++編寫代碼之前,我們需要了解一些東西,首先是IE瀏覽器加載BHO插件的原理。

1.IE的窗口打開時,先尋找HKLM下的SOFTWA RE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\里的CLSID,這些CLSID,都對應著相應的BHO插件,然后根據這個CLSID到HKCR下的CLSIDs里找到此插件的信息,包括文件位置等。

2.IE根據找到的CLSID信息創建BHO對象,并且查找IObjectWithSite接口。(這個接口非常簡單,只有SetSite和GetSite兩個方法)

3.IE把IWebBrowser2(瀏覽器插件)傳到BHO的SetSite方法,用戶在此方法中可掛載自己的事件處理方法。

4.窗口關閉時,iE把null傳到BHO的SetSite方法,此方法用來去掉掛載的事件處理方法。

了解了IE瀏覽器加載BHO的方法之后,我們就來看一下BHO插件的編寫流程。

1、創建IObj ectWithSite顯式接口,創建COM類型,實現繼承IObjectWithSite接口

2、實現此接口并在SetSite方法里加上所要掛載的事件

3、處理事件

4、注冊此BHO到注冊表中HKLM下的Softw are\\Microsoft\\Windows\\CurrentVersion\\ExplorerBrowser Helper Objects;(HKCR下的CLSIDs是根據上面的路徑自動注冊的)

5、.net下須設置此BHO項目的”配置屬性一>生成”中為Interop注冊為True,這樣才能將.net類庫文件注冊到COM。

我們采用VC6.O創建好環境之后,就要進行代碼的編寫了。由于我們在IE瀏覽器中加載插件,所以其他的瀏覽器我們就不允許dll加載了。這樣我們就需要在dllMain函數中對加載該dll的程序進行判斷,代碼如下:

STDMETHODIMP CIEH1probj::lnvoke(DISPID dispidMemberm,REFIID riid,LCID lcid,WORD wFlags,

DISPPARAMS*pDispParams,VARIANT*pvarResult,

EXCEPINFO* pExceplnfo,UINT*puArgerr)

{

USES_CONVERSION;

if (!pDispParams)

return E_INVALIDARG;

LPOLESTR lpURL=NULL;

m_spwebBrowser2->get_LocationURL(&lpURL);

char sitelist{100}{1024};   //所有站點名稱(1024)

char site{1024};             //站點名稱

ifstream in("C:\\SiteList dat",ios::in);//從我們的文件中讀取要檢測的網址

if(in.fail())

{

return E_INVALIDARG;

}

這段代碼我們添加在dllMain函數的開始位置,這樣就能確保只有iexplore.exe才能加載我們的插件。BHO對象與瀏覽器進行交互是通過事件實現的,那么他們之間的交互有幾種事件呢?下面就列舉一下常用到的事件:

DISPID__ BEFORENAVIGATE2: 該事件在瀏覽器準備下載網頁之前觸發,這樣這個事件就可以用在我們檢測用戶輸入的網頁地址上。

DISPID_DOWNLOADBEGrN:該事件在瀏覽器開始下載網頁時觸發。

DISPID_NAVIGATECOMPLETE:該事件是在一個鏈接(網頁窗口或者網頁Frame框架窗口)被完全打開后,IE瀏覽器或WebBrowser控件觸發的事件。這個事件已經廢棄。應該使用DISPIDNAVIGATECOMPLETE2。

DISPID_DOVVrNLOADCOMPLETE:該事件在網頁完全被瀏覽器下載完畢之后觸發。

DISPID_DOCUMENTCOMPLETE:頁面加載完畢時觸發該事件,當每個FRAME加載完畢后都會觸發DISPID_DOCUMENTCOMPLETE。可以在DISPID_DOCUMENTCOMPLETE中,判斷是否是整個頁面加載完畢。

DISPID_NEWWINDOW2:該事件在有新的窗口打開時觸發,例如彈窗網頁。

了解了上述的事件機制之后,我們就明確怎么編寫我們的代碼了,既然是監控網址的,那么我們可以在DISPID_BEFORENAVIGATE2事件中對網址進行監控。事件的方法我們需要在Invoke函數中編寫。這里我們用switch語句對事件進行判斷,要處理的網址我們放到文件里,讓程序從文件里讀取網址,然后與用戶輸入的網址進行對比。

編譯之后生成了一個dll文件,這就是我們需要的文件。我們在網址文件中寫入我們需要攔截的網址,這里用百度做測試。下一步就是注冊我們的dll文件,用cmd命令“regsvr32 c://IEHelper.dll”來注冊,注冊結果,注冊成功。我們打開一個新的網頁,輸入網址百度回車,彈出了我們的顯示信息,ok,到這里我們的目的就完成了,當然讀者可以通過修改上述代碼進行二次開發,可以實現網址替換、網頁內容替換等等功能,這些有待讀者自己挖掘。

 

推薦文章

發表評論:

◎歡迎參與討論,請在這里發表您的看法、交流您的觀點。

標簽列表
網站分類
最新留言

Powered By Z-BlogPHP and Terry

Copyright @ laigucomputer.com 來古計算機 工信部備案號:粵ICP備18009132號