開發BHO外掛程式3

2021-06-18 05:20:17 字數 4500 閱讀 8299

bho(browser helper object,瀏覽器輔助物件,簡稱bho)

bho是微軟推出的作為瀏覽器對第三方程式設計師開放互動介面的業界標準,通過簡單的**就可以進入瀏覽器領域的「互動介面」(interactived inte***ce)。通過這個介面,程式設計師可以編寫**獲取瀏覽器的行為,比如「後退」、「前進」、「當前頁面」等,利用bho的互動特性,程式設計師還可以用**控制瀏覽器行為,比如修改替換瀏覽器工具欄,新增自己的程式按鈕等。

在vs中建立乙個bho(使用c++),需要以下步驟:

1.新建乙個atl工程,起名為bhodemo

2.工程新建好之後,切換到類檢視,新加乙個atl簡單物件mybho,按照嚮導所示,新增過程中選中支援iobjectwithsite

3.可以看到,生成了乙個介面實現類cmybho,在其中新增乙個繼承的父類:public  idispeventimpl<1 ,cmybho,&diid_dwebbrowserevents2,&libid_shdocvw,1 ,1 > 和兩個方法

stdmethod(setsite)(iunknown * punksite);  // 覆蓋父類iobjectwithsiteimpl的方法

void stdmethodcalltype ondocumentcomplete(idispatch* pdisp, variant* url);//文件載入完成時的動作

4.新增事件接收器部分:

begin_sink_map(cmybho)

sink_entry_ex(1, diid_dwebbrowserevents2, dispid_documentcomplete, ondocumentcomplete)

end_sink_map()

此時第乙個引數1,要和idispeventimpl後面引數中的1的數值要保持一致.這樣dispid_documentcomplete訊息由ie傳過來到bho時,才會呼叫對應的ondocumentcomplete.可以繼承多idispeventimpl的,但要保證裡面第乙個引數,即序號不一樣.

5.實現setsite和ondocumentcomplete

由於暫時還不做更多操作,所以setsite實現直接呼叫iobjectwithsiteimpl::setsite(punksite);而ondocumentcomplete先放空.

現在的原始檔應該是長這個樣子的:

1:  

// mybho.h : cmybho 的宣告

2:
3:  

#pragma once

4:  #include "resource.h"

// 主符號

5:  #include "exdispid.h"
6:
7:  #include "bhodemo_i.h"
8:
9:  

#if defined(_win32_wce) && !defined(_ce_dcom) && !defined(_ce_allow_single_threaded_objects_in_mta)

10:  

#error

"windows ce 平台(如不提供完全 dcom 支援的 windows mobile 平台)上無法正確支援單執行緒 com 物件。定義 _ce_allow_single_threaded_objects_in_mta 可強制 atl 支援建立單執行緒 com 物件實現並允許使用其單執行緒 com 物件實現。rgs 檔案中的執行緒模型已被設定為「free」,原因是該模型是非 dcom windows ce 平台支援的唯一執行緒模型。"

11:  

#endif

12:
13:  

using

namespace atl;

14:
15:  

// cmybho

16:
17:  

class atl_no_vtable cmybho :

18:  

public ccomobjectrootex,

19:  

public ccomcoclass,

20:  

public iobjectwithsiteimpl,

21:  

public idispatchimpl/*wmajor =*/ 1, /*wminor =*/ 0>,

22:  

public idispeventimpl<1 ,cmybho,&diid_dwebbrowserevents2,&libid_shdocvw,1 ,1 >

23:
28:
29:  declare_registry_resourceid(idr_mybho)
30:
31:  begin_com_map(cmybho)
32:      com_inte***ce_entry(imybho)
33:      com_inte***ce_entry(idispatch)
34:      com_inte***ce_entry(iobjectwithsite)
35:  end_com_map()
36:
37:  

//路由表

38:      begin_sink_map(cmybho)
39:          sink_entry_ex(1, diid_dwebbrowserevents2, dispid_documentcomplete, ondocumentcomplete)
40:      end_sink_map()
41:
42:      declare_protect_final_construct()
43:
44:      hresult finalconstruct()
45:
48:
49:  

void finalrelease()

50:
52:
53:  

public:

54:      stdmethod(setsite)(iunknown * punksite);  // 覆蓋父類iobjectwithsiteimpl的方法
55:  

void stdmethodcalltype ondocumentcomplete(idispatch* pdisp, variant* url);//文件載入完成時的動作

56:  };
57:
58:  object_entry_auto(__uuidof(mybho), cmybho)
cpp檔案應該是這樣:

1:  

// mybho.cpp : cmybho 的實現

2:
3:  #include "stdafx.h"
4:  #include "mybho.h"
5:
6:
7:  

// cmybho

8:  

// 覆蓋父類iobjectwithsiteimpl的方法

9:  stdmethodimp cmybho::setsite(iunknown * punksite)
10:
14:  

void stdmethodcalltype cmybho::ondocumentcomplete(idispatch* pdisp, variant* url)//文件載入完成時的動作

15:
6.登錄檔檔案

修改bhodemo.rgs檔案,刪除原先內容,改為:

hklm

= s 'bho demo class'}}

}}}}

}

其中forceremove 後面的值是抄的idl檔案中mybho的guid的值.
7.編譯,然後開啟ie就能看到是否啟用bhodemo的提示了.win7下編譯可能會出錯,提示許可權問題.這個時候,需要以管理員許可權執行vs才行的.

解除安裝:直接去工程debug目錄中regsvr32 /u bhodemo.dll就行了.同樣要注意win7下的許可權問題.

Bho編定ie外掛程式

activex control 例如 flash,銀行專用輸入框等等。browser extensions http msdn2.microsoft.com en us library aa753587 vs.85 aspx 例如 zend studio,浩方對戰平台等等。browser exten...

如何清除網頁的bho外掛程式

最近開啟ie瀏覽器老是彈出不想彈出的東西,首頁也被改了。知道這個是bho在作怪。黑心的流氓軟體在偷偷的修改機器的配置和安裝他們的外掛程式,雖然不是病毒,其性質和病毒一樣。如何刪除?登錄檔的hkey local machine software microsoft windows currentver...

BHO開發中的IE事件響應原理

ps 本文適合於對虛表 模板等語法特性熟悉的朋友。atl的idispeventimpl簡化了事件響應的編碼流程。一般需要3個步驟 1 繼承idispeventimpl public idispeventimpl 1,csayhello,diid dwebbrowserevents2 2 新增sink...