青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

開(kāi)發(fā)BHO插件

Posted on 2009-10-09 12:24 S.l.e!ep.¢% 閱讀(665) 評(píng)論(0)  編輯 收藏 引用 所屬分類: IE_BHO

開(kāi)發(fā)BHO插件

正文
在Windows操作系統(tǒng)上,我們最常見(jiàn)的瀏覽器有兩種:文件瀏覽器(exploer.exe,應(yīng)用于文件系統(tǒng))和Internet瀏覽器(iexplore.exe,應(yīng)用于互聯(lián)網(wǎng)資源)。由于這兩個(gè)瀏覽器功能強(qiáng)大,而且又與Windows操作系統(tǒng)捆綁銷售,最終也就成為了瀏覽器的標(biāo)準(zhǔn)。但有時(shí)候,為了給瀏覽器加入一些新的特性,我們往往會(huì)重新設(shè)計(jì)一個(gè)自己的瀏覽器。新的瀏覽器模仿標(biāo)準(zhǔn)瀏覽器的大部分功能,同時(shí)加入新特性。這種做法最直觀,但實(shí)際上也是相對(duì)于微軟的重復(fù)勞動(dòng),且工作量比較大。其實(shí),使用BHO插件,一切都變得很簡(jiǎn)單。

BHO(Browser Help Objects),是實(shí)現(xiàn)了特定接口的COM組件。開(kāi)發(fā)好的BHO插件在注冊(cè)表特定的位置注冊(cè)好后,每當(dāng)微軟的瀏覽器啟動(dòng),BHO實(shí)例就會(huì)被創(chuàng)建。在瀏覽器工作的工程中,BHO會(huì)接收到很多事件,比如瀏覽器瀏覽新的地址、前進(jìn)或后退、生成新的窗口、瀏覽器退出等等;BHO可以在這些事件的響應(yīng)中實(shí)現(xiàn)與瀏覽器的交互。

下面,我們首先來(lái)介紹一下BHO的工作原理。上面我們已經(jīng)提到,BHO是COM組件,而且一定實(shí)現(xiàn)了IObjectWithSite接口。這些組件除了在注冊(cè)表中注冊(cè)為COM Server外,還必須將它們的CLSID在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\Explorer\Browser Helper Objects下注冊(cè)為子鍵。微軟在設(shè)計(jì)瀏覽器的時(shí)候,已經(jīng)給這些組件預(yù)留了空間。每當(dāng)瀏覽器啟動(dòng)時(shí),瀏覽器會(huì)首先在上述注冊(cè)表位置查看是否有注冊(cè)的BHO CLSID;如果有則分別創(chuàng)建一個(gè)實(shí)例,并對(duì)BHO實(shí)例進(jìn)行初始化,建立交互連接。(注:BHO實(shí)例只有在創(chuàng)建它的瀏覽器窗口銷毀時(shí)才被釋放。)下圖演示了BHO的創(chuàng)建過(guò)程:
說(shuō)明 Createbho.jpg

成功創(chuàng)建的BHO,不僅可以得到各種標(biāo)準(zhǔn)的瀏覽器操作事件,并做出響應(yīng);還可以定制瀏覽器的菜單、工具條等界面元素;更或者可以安裝鉤子函數(shù),監(jiān)視瀏覽器的一舉一動(dòng)。值得注意的是,使用BHO插件,Internet瀏覽器要求在4.0以上版本;如果是文件瀏覽器,操作系統(tǒng)要求是Windows 95/98/2000或Window NT 4.0以上版本,并且Shell的版本在4.71以上。下面是支持BHO特性的系統(tǒng)一覽表:

Shell版本 操作系統(tǒng)版本 支持BHO
4.00 Windows 95 and Windows NT 4.0(IE版本為 4.0) 僅IE4.0
4.71 Windows 95 and Windows NT 4.0(IE版本為 4.0) IE和文件瀏覽器
4.72 Windows 98 IE和文件瀏覽器
5.00??Windows 2000 IE和文件瀏覽器

接下去,筆者就來(lái)介紹一下如何開(kāi)發(fā)BHO插件,開(kāi)發(fā)環(huán)境為VC6.0(使用ATL),安裝Platform SDK中的Internet Development SDK。首先,啟動(dòng)VC的ATL COM AppWizard,生成一個(gè)項(xiàng)目名為BhoPlugin,其余均采用默認(rèn)設(shè)置。接著,我們就來(lái)分步詳細(xì)闡述。
第一步,增加一個(gè)ATL Object到該項(xiàng)目中。VC菜單Insert->New ATL Object…,在彈出的對(duì)話框中選擇“Internet Explorer Object”,輸入COM類名(在Short Name后輸入EyeOnIE,其它各項(xiàng)會(huì)自動(dòng)生成)。完成后,我們可以看到CEyeOnIE類有一個(gè)基類IObjectWithSiteImpl,這個(gè)就是實(shí)現(xiàn)IObjectWithSite接口的模版類。
第二步,實(shí)現(xiàn)IObjectWithSite的接口方法。在這之前,我們要先定義幾個(gè)成員變量:CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> mWebBrowser2,(需要加入#include "ExDisp.h"),用以保存瀏覽器組件的指針;DWORD mCookie,用以保存與瀏覽器的連接ID。IObjectWithSite有兩個(gè)接口方法:SetSite和GetSite。我們只需重載SetSite就行了。在EyeOnIE.h中增加函數(shù)聲明STDMETHOD(SetSite)(IUnknown *pUnkSite),在EyeOnIE.cpp實(shí)現(xiàn)如下:
STDMETHODIMP CEyeOnIE::SetSite(IUnknown *pUnkSite)
{
USES_CONVERSION;

if (pUnkSite)
{
mWebBrowser2 = pUnkSite;
if (mWebBrowser2)
{
return RegisterEventHandler(TRUE);
}
}
return E_FAIL;
}

HRESULT CEyeOnIE::RegisterEventHandler(BOOL inAdvise)
{
CComPtr<IConnectionPoint> spCP;
// Receives the connection point for WebBrowser events
CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> spCPC(mWebBrowser2);
HRESULT hr = spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP);
if (FAILED(hr))
return hr;

if (inAdvise)
{
// Pass the event handlers to the container
hr = spCP->Advise(reinterpret_cast<IDispatch*>(this), &mCookie);
}
else
{
spCP->Unadvise(mCookie);
}
return hr;
}
我們可以看到,SetSite的參數(shù)實(shí)際上指向的是瀏覽器組件。在SetSite實(shí)現(xiàn)中,我們首先保存瀏覽器組件指針,然后將該BHO向?yàn)g覽器注冊(cè)為事件處理器。
第三步,實(shí)現(xiàn)IDispatch接口方法。事件處理也就在IDispatch::Invoke中實(shí)現(xiàn)(各個(gè)事件的ID在ExDispID.h中定義)。BHO可能會(huì)接收到很多事件,但我們只需要響應(yīng)我們感興趣的那一部分。首先在EyeOnIE.h中增加該函數(shù)的聲明,在EyeOnIE.cpp的實(shí)現(xiàn)中,筆者試著響應(yīng)瀏覽器瀏覽一個(gè)地址之前發(fā)出的事件DISPID_BEFORENAVIGATE2,以此來(lái)實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)址過(guò)濾功能,代碼參考如下:
STDMETHODIMP CEyeOnIE::Invoke(DISPID dispidMember,REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS * pDispParams,
VARIANT * pvarResult,EXCEPINFO * pexcepinfo,
UINT * puArgErr)
{
USES_CONVERSION;

if (!pDispParams)
return E_INVALIDARG;

switch (dispidMember)
{
//
// The parameters for this DISPID are as follows:
// [0]: Cancel flag - VT_BYREF|VT_BOOL
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT
// [3]: Target frame name - VT_BYREF|VT_VARIANT
// [4]: Option flags - VT_BYREF|VT_VARIANT
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_BEFORENAVIGATE2:
{
LPOLESTR lpURL = NULL;
mWebBrowser2->get_LocationURL(&lpURL);
char * strurl;
if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
strurl = OLE2A(varURL.bstrVal);
}
if (strstr(strurl, "girl.com"))
{
*pDispParams->rgvarg[0].pboolVal = TRUE;
::MessageBox(NULL, _T("該網(wǎng)頁(yè)已被禁止!"),_T("Warning"),MB_ICONSTOP);
return S_OK;
}
break;
}

case DISPID_NAVIGATECOMPLETE2:
break;
case DISPID_DOCUMENTCOMPLETE:
break;
case DISPID_DOWNLOADBEGIN:
break;
case DISPID_DOWNLOADCOMPLETE:
break;
case DISPID_NEWWINDOW2:
break;
case DISPID_QUIT:
RegisterEventHandler(FALSE);
break;
default:
break;
}

return S_OK;
}
我們看到,當(dāng)用戶瀏覽的新地址包含"girl.com"字符的時(shí)候,瀏覽器就會(huì)彈出一個(gè)警告對(duì)話框,并且停止進(jìn)一步的動(dòng)作。另外值得注意的是,在DISPID_QUIT事件(瀏覽器將要退出)的響應(yīng)中,我們將BHO事件處理器進(jìn)行了注銷。
第四步,因?yàn)锽HO可能會(huì)被文件瀏覽器加載。如果我們不想這樣,我們就要在DllMain中對(duì)加載者進(jìn)行判斷,參考如下:
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
// Check who's loading us.
// If it's Explorer then "no thanks" and exit...
TCHAR pszLoader[MAX_PATH];
GetModuleFileName(NULL, pszLoader, MAX_PATH);
_tcslwr(pszLoader);
if (_tcsstr(pszLoader, _T("explorer.exe")))
return FALSE;

_Module.Init(ObjectMap, hInstance, &LIBID_BHOPLUGINLib);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
最后,別忘了修改注冊(cè)表文件,追加BHO的注冊(cè)信息。在EyeOnIE.rgs文件的下面增加如下代碼:
HKLM
{
SOFTWARE
{
Microsoft
{
Windows
{
CurrentVersion
{
Explorer
{
'Browser Helper Objects'
{
{6E28339B-7A2A-47B6-AEB2-46BA53782379}
}
}
}
}
}
}
}
注意,{6E28339B-7A2A-47B6-AEB2-46BA53782379}是筆者這個(gè)BHO的CLSID,如果你自己開(kāi)發(fā)BHO,這里應(yīng)該正確填寫(xiě)你的CLSID。

好了,一個(gè)簡(jiǎn)單的BHO開(kāi)發(fā)完成了。(可以到本人的個(gè)人主頁(yè) http://hqtech.nease.net/ 下載實(shí)例源代碼。)BHO插件可以實(shí)現(xiàn)的功能還有很多,比如網(wǎng)頁(yè)內(nèi)容分析、IE界面定制等等。作為總結(jié),筆者還要提醒讀者一點(diǎn)的是,如果不想讓BHO起作用了,可以注銷該插件,如下格式:regsvr32 /u yourpath\yourbho.dll,或者直接在注冊(cè)表中將“Browser Helper Objects”目錄下注冊(cè)的CLSID刪掉。

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情欧美激情| 亚洲综合999| 欧美日韩综合在线| 欧美激情亚洲精品| 欧美二区在线看| 欧美日韩精品一区二区天天拍小说| 欧美高清在线| 欧美深夜福利| 国产小视频国产精品| 一区二区三区在线视频免费观看| 精品69视频一区二区三区 | 国产精品一区在线观看| 国产乱人伦精品一区二区| 国内外成人免费视频| 亚洲成色999久久网站| 99精品热视频只有精品10| 亚洲在线观看免费视频| 久久午夜电影| 99精品国产热久久91蜜凸| 午夜免费久久久久| 欧美激情在线免费观看| 国产婷婷色一区二区三区四区| 亚洲国产成人久久综合一区| 亚洲一区二区三区四区在线观看| 老牛嫩草一区二区三区日本 | 欧美午夜电影完整版| 国产一区二区三区不卡在线观看| 亚洲欧洲一区二区天堂久久 | 亚洲国产成人高清精品| 亚洲破处大片| 久久精品日产第一区二区| 欧美激情国产精品| 国内精品美女av在线播放| 夜夜精品视频| 免费不卡在线观看av| 99re热这里只有精品视频| 久久久久久综合网天天| 国产精品九九久久久久久久| 91久久在线观看| 久久一区国产| 亚洲社区在线观看| 欧美激情bt| 一区二区视频免费在线观看 | 欧美中文字幕在线视频| 亚洲国产精品视频| 久久精品欧美日韩| 国产人妖伪娘一区91| 亚洲一区二区动漫| 亚洲精品一区二区三区福利| 久久伊人免费视频| 国产女同一区二区| 午夜久久久久久久久久一区二区| 亚洲日本欧美日韩高观看| 免费在线看一区| 狠狠色综合网| 麻豆国产va免费精品高清在线| 欧美一区二区视频在线观看| 国产伦精品一区二区三区四区免费 | 亚洲欧洲综合| 免费视频一区二区三区在线观看| 在线成人h网| 欧美刺激性大交免费视频| 久久五月激情| 亚洲国产一区二区三区在线播| 老司机精品视频网站| 久久久蜜桃一区二区人| 亚洲第一精品电影| 亚洲国产精品第一区二区| 欧美日韩国产123区| 亚洲女同精品视频| 欧美亚洲综合在线| 亚洲福利视频网站| 亚洲精选国产| 国产热re99久久6国产精品| 久久久爽爽爽美女图片| 开心色5月久久精品| 99视频精品在线| 亚洲一区3d动漫同人无遮挡| 国产视频亚洲精品| 国产视频一区在线观看| 在线观看成人av| 亚洲高清三级视频| 欧美精品一区二区三区蜜桃| 中国成人黄色视屏| 欧美一区二区国产| 亚洲国产另类精品专区| 一本大道久久a久久综合婷婷| 国产农村妇女精品一区二区| 欧美成人综合一区| 国产精品亚洲精品| 亚洲国产精品久久人人爱蜜臀 | 欧美一区激情| 亚洲国产精品t66y| 亚洲一区二区三区久久| 亚洲黄色免费| 午夜精彩视频在线观看不卡| 亚洲人成亚洲人成在线观看图片| 中日韩美女免费视频网址在线观看| 黄色av一区| 亚洲小视频在线观看| 91久久精品美女高潮| 香蕉成人伊视频在线观看| 日韩午夜av| 欧美在线一二三区| 国产精品99久久久久久有的能看 | 欧美mv日韩mv国产网站| 国产精品成人午夜| 亚洲高清不卡| 亚洲盗摄视频| 小黄鸭精品密入口导航| 亚洲尤物在线| 欧美激情一二区| 蜜桃av一区| 国产在线播精品第三| 一区二区三区.www| 夜夜嗨av色一区二区不卡| 久久久av水蜜桃| 新狼窝色av性久久久久久| 欧美精品免费在线观看| 麻豆91精品91久久久的内涵| 国产精品自拍小视频| 一本色道久久精品| 在线一区欧美| 欧美日韩伦理在线| 亚洲激精日韩激精欧美精品| 在线不卡中文字幕| 久久天天狠狠| 久久天天躁狠狠躁夜夜av| 国产精品一区二区久激情瑜伽| av成人黄色| 亚洲一区二区三区免费观看| 欧美日韩国产综合视频在线观看中文 | 最新日韩在线| 欧美在线观看网站| 久久精品国产成人| 国产日韩欧美高清| 亚洲欧美久久| 亚洲天天影视| 午夜精彩国产免费不卡不顿大片| 欧美国产大片| 亚洲精品少妇| 在线视频你懂得一区二区三区| 欧美国产91| 99这里有精品| 亚洲欧美激情四射在线日| 国产精品九九| 欧美在线播放一区| 嫩草影视亚洲| 亚洲精品一二| 欧美视频一区二区三区四区| 中日韩男男gay无套 | 亚洲欧洲精品天堂一级| 亚洲国产一区二区视频| 欧美大色视频| 亚洲手机在线| 久久午夜色播影院免费高清| 一区二区在线观看视频| 免费观看成人鲁鲁鲁鲁鲁视频 | 久久综合免费视频影院| 欧美成va人片在线观看| 99re视频这里只有精品| 国产精品视频福利| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲精品日韩一| 久久精品国产一区二区三| 亚洲国产一区二区三区青草影视| 欧美日韩综合视频| 久久国产精品久久久| 最新69国产成人精品视频免费| 亚洲永久字幕| 91久久久久久国产精品| 国产精品嫩草影院一区二区| 久久亚洲一区| 亚洲影视综合| 亚洲区一区二| 欧美www视频在线观看| 亚洲欧美精品在线观看| 136国产福利精品导航| 欧美午夜一区二区三区免费大片| 久久xxxx精品视频| 日韩系列在线| 欧美成人免费网站| 久久精品二区| 亚洲欧美卡通另类91av| 亚洲美女淫视频| 黄色在线一区| 国产精品久久久爽爽爽麻豆色哟哟| 久久亚洲图片| 欧美一级大片在线免费观看| 99精品热视频| 亚洲人成网站777色婷婷| 久久综合给合| 久久久久九九九九| 欧美一区国产一区| 亚洲午夜羞羞片| 99国产精品久久久久久久| 尤物yw午夜国产精品视频明星| 国产精品免费一区豆花| 欧美午夜精品久久久| 欧美国产一区视频在线观看|