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

旅途

如果想飛得高,就該把地平線忘掉

BHO開發(fā)基礎(chǔ)

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

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

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

成功創(chuàng)建的BHO,不僅可以得到各種標準的瀏覽器操作事件,并做出響應(yīng);還可以定制瀏覽器的菜單、工具條等界面元素;更或者可以安裝鉤子函數(shù),監(jiān)視瀏覽器 的一舉一動。值得注意的是,使用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和文件瀏覽器

接下去,筆者就來介紹一下如何開發(fā)BHO插件,開發(fā)環(huán)境為VC6.0(使用ATL),安裝Platform SDK中的Internet Development SDK。首先,啟動VC的ATL COM AppWizard,生成一個項目名為BhoPlugin,其余均采用默認設(shè)置。接著,我們就來分步詳細闡述。
第一步,增加一個ATL Object到該項目中。VC菜單Insert->New ATL Object…,在彈出的對話框中選擇“Internet Explorer Object”,輸入COM類名(在Short Name后輸入EyeOnIE,其它各項會自動生成)。完成后,我們可以看到CEyeOnIE類有一個基類IObjectWithSiteImpl,這個 就是實現(xiàn)IObjectWithSite接口的模版類。
第二步,實現(xiàn)IObjectWithSite的接口方法。在這之前,我們要先定義幾個成員變量:CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> mWebBrowser2,(需要加入#include "ExDisp.h"),用以保存瀏覽器組件的指針;DWORD mCookie,用以保存與瀏覽器的連接ID。IObjectWithSite有兩個接口方法:SetSite和GetSite。我們只需重載 SetSite就行了。在EyeOnIE.h中增加函數(shù)聲明STDMETHOD(SetSite)(IUnknown *pUnkSite),在EyeOnIE.cpp實現(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ù)實際上指向的是瀏覽器組件。在SetSite實現(xiàn)中,我們首先保存瀏覽器組件指針,然后將該BHO向瀏覽器注冊為事件處理器。
第三步,實現(xiàn)IDispatch接口方法。事件處理也就在IDispatch::Invoke中實現(xiàn)(各個事件的ID在ExDispID.h中定義)。 BHO可能會接收到很多事件,但我們只需要響應(yīng)我們感興趣的那一部分。首先在EyeOnIE.h中增加該函數(shù)的聲明,在EyeOnIE.cpp的實現(xiàn)中, 筆者試著響應(yīng)瀏覽器瀏覽一個地址之前發(fā)出的事件 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)頁已被禁止!"),_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;
}
我們看到,當用戶瀏覽的新地址包含"girl.com"字符的時候,瀏覽器就會彈出一個警告對話框,并且停止進一步的動作。另外值得注意的是,在DISPID_QUIT事件(瀏覽器將要退出)的響應(yīng)中,我們將BHO事件處理器進行了注銷。
第四步,因為BHO可能會被文件瀏覽器加載。如果我們不想這樣,我們就要在DllMain中對加載者進行判斷,參考如下:
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
}
最后,別忘了修改注冊表文件,追加BHO的注冊信息。在EyeOnIE.rgs文件的下面增加如下代碼:
HKLM
{
SOFTWARE
{
Microsoft
{
Windows
{
CurrentVersion
{
Explorer
{
'Browser Helper Objects'
{
{6E28339B-7A2A-47B6-AEB2-46BA53782379}
}
}
}
}
}
}
}
注意,{6E28339B-7A2A-47B6-AEB2-46BA53782379}是筆者這個BHO的CLSID,如果你自己開發(fā)BHO,這里應(yīng)該正確填寫你的CLSID。

BHO插件可以實現(xiàn)的功能還有很多,比如網(wǎng)頁內(nèi)容分析、IE界面定制等等。作為總結(jié),筆者還要提醒讀者一點的是,如果不想讓BHO起作用了,可以注銷該插 件,如下格式:regsvr32 /u yourpathyourbho.dll,或者直接在注冊表中將“Browser Helper Objects”目錄下注冊的CLSID刪掉。

posted on 2007-07-29 14:59 旅途 閱讀(1951) 評論(0)  編輯 收藏 引用 所屬分類: BHO

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            韩国一区电影| 午夜天堂精品久久久久| 亚洲午夜久久久久久久久电影院 | 91久久黄色| 久久香蕉国产线看观看av| 久久综合久久久久88| 欧美成人高清视频| 91久久视频| 中文高清一区| 久久精品理论片| 欧美黑人一区二区三区| 欧美性色综合| 伊人精品久久久久7777| 夜夜嗨av一区二区三区中文字幕| 在线视频欧美日韩精品| 欧美影视一区| 欧美日韩一区自拍| 国产精品一区二区在线观看不卡 | 久久米奇亚洲| 欧美日本一道本| 国产日韩欧美在线播放不卡| 在线看欧美日韩| 亚洲综合色激情五月| 久久资源av| 亚洲三级毛片| 久久av最新网址| 欧美日韩免费观看一区三区| 国产欧美日韩视频在线观看 | 美玉足脚交一区二区三区图片| 亚洲国产精品视频| 午夜精品一区二区三区四区 | 亚洲国产精品va在线观看黑人| 欧美va天堂va视频va在线| 欧美性开放视频| 亚洲国产精品99久久久久久久久| 亚洲视频导航| 欧美顶级少妇做爰| 欧美一区二区观看视频| 欧美日韩免费观看中文| 亚洲国产日本| 久久久噜噜噜久久狠狠50岁| 一区二区动漫| 欧美精品久久天天躁| 精品动漫一区二区| 欧美夜福利tv在线| 日韩一级在线| 猛男gaygay欧美视频| 国产九色精品成人porny| av成人动漫| 欧美激情综合| 老司机精品视频网站| 国产一区二区高清视频| 香蕉久久夜色| 亚洲欧美福利一区二区| 国产精品视频yy9099| 夜夜嗨av一区二区三区四区| 亚洲国产精品t66y| 久久久久亚洲综合| 国产一区二区三区久久精品| 欧美亚洲在线| 亚洲欧美三级伦理| 国产一区二区三区成人欧美日韩在线观看 | 亚洲一级黄色| 在线一区亚洲| 国产精品蜜臀在线观看| 亚洲欧美日韩一区二区在线| 亚洲一区二区伦理| 国产欧美日韩另类一区 | 中文欧美字幕免费| 国产精品日韩久久久久| 欧美一区激情| 久久xxxx精品视频| 亚洲成人自拍视频| 亚洲韩国精品一区| 国产精品免费视频观看| 久久久999国产| 另类天堂视频在线观看| 一区二区三区视频在线播放| 国产精品99久久久久久久vr| 国产欧美一区二区三区沐欲| 久久久久久电影| 欧美刺激性大交免费视频| 在线视频一区观看| 亚洲欧美日韩综合国产aⅴ| 亚洲成人在线网| 一本久道久久综合狠狠爱| 国产亚洲欧美中文| 亚洲国产一区二区精品专区| 久久国产精品99久久久久久老狼| 久久久久五月天| 夜夜嗨av一区二区三区四季av| 亚洲视频视频在线| 狠狠色丁香久久婷婷综合_中| 亚洲电影成人| 国产欧美在线观看| 亚洲国产精品一区二区www在线 | 欧美精品色综合| 亚洲线精品一区二区三区八戒| 亚洲无吗在线| 在线欧美亚洲| 亚洲一区二区三区四区五区黄| 在线免费观看日本欧美| 亚洲天天影视| 亚洲日韩成人| 久久精品亚洲热| 亚洲欧美精品suv| 欧美高清你懂得| 久久久伊人欧美| 国产精品久久久久久影院8一贰佰| 麻豆freexxxx性91精品| 国产伦精品一区二区三区四区免费 | 亚洲第一精品福利| 国产精品中文在线| 亚洲毛片av在线| 亚洲精品1234| 久久久精品国产免费观看同学| 亚洲午夜免费福利视频| 欧美极品一区| 亚洲国产欧美一区二区三区久久| 国产午夜精品美女视频明星a级 | 欧美日韩亚洲一区二区| 欧美成人一区二区三区| 国产一区二区三区在线观看视频| 亚洲视频欧洲视频| 亚洲一区在线视频| 欧美视频1区| 一二三四社区欧美黄| 日韩一区二区免费看| 欧美成人免费全部| 亚洲成人资源| 91久久精品国产91久久性色tv| 欧美中文字幕在线观看| 久久亚洲不卡| 亚洲国产成人不卡| 美女主播精品视频一二三四| 久久夜色精品国产欧美乱极品| 国产一区二区av| 久久久久99| 欧美国产欧美综合| 亚洲激情欧美激情| 欧美另类一区| 一区二区三区高清| 午夜精品视频| 日韩午夜电影在线观看| 欧美理论电影在线播放| 亚洲韩国青草视频| 亚洲视屏在线播放| 国产精品家教| 欧美一区二区三区四区在线观看| 久久久激情视频| 亚洲二区在线| 欧美精品粉嫩高潮一区二区 | 亚洲国产日韩一区二区| 欧美激情国产日韩| 亚洲私人黄色宅男| 久久激情网站| 亚洲欧洲一区二区三区久久| 欧美精品一区二区三区在线播放| 日韩亚洲欧美一区| 久久av一区二区| 亚洲国产影院| 国产精品美女久久久浪潮软件| 久久精品国产久精国产一老狼| 久久中文久久字幕| 亚洲视频在线观看视频| 国产日韩欧美精品综合| 免费亚洲婷婷| 亚洲一区制服诱惑| 亚洲第一页在线| 午夜亚洲视频| 亚洲日本va午夜在线电影| 国产精品久久九九| 久久一区视频| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲激情亚洲| 欧美自拍偷拍午夜视频| 亚洲免费成人av| 国产亚洲综合精品| 欧美日韩免费观看一区| 久久婷婷色综合| 亚洲免费视频网站| 亚洲精品久久久久久久久久久| 欧美资源在线观看| 亚洲特级片在线| 亚洲国产精品电影在线观看| 国产精品视频一| 欧美另类亚洲| 免费中文日韩| 久久免费99精品久久久久久| 亚洲一级免费视频| 亚洲人成77777在线观看网| 久久久久久亚洲综合影院红桃 | 亚洲美女中文字幕| 麻豆久久精品| 久久精品一区二区| 亚洲欧美视频在线观看视频| 99re6热在线精品视频播放速度| 狠狠久久亚洲欧美| 国产欧美一区二区精品性色| 欧美日韩午夜剧场|