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

隨筆 - 47, 文章 - 10, 評論 - 8, 引用 - 0
數(shù)據(jù)加載中……

VC++開發(fā)BHO插件——定制你的瀏覽器

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

  BHO(Browser Help Objects),是實(shí)現(xiàn)了特定接口的COM組件。開發(fā)好的BHO插件在注冊表特定的位置注冊好后,每當(dāng)微軟的瀏覽器啟動,BHO實(shí)例就會被創(chuàng)建。在瀏覽器工作的工程中,BHO會接收到很多事件,比如瀏覽器瀏覽新的地址、前進(jìn)或后退、生成新的窗口、瀏覽器退出等等;BHO可以在這些事件的響應(yīng)中實(shí)現(xiàn)與瀏覽器的交互。
 
  下面,我們首先來介紹一下BHO的工作原理。上面我們已經(jīng)提到,BHO是COM組件,而且一定實(shí)現(xiàn)了IObjectWithSite接口。這些組件除了在注冊表中注冊為COM Server外,還必須將它們的CLSID在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\Explorer\Browser Helper Objects下注冊為子鍵。微軟在設(shè)計(jì)瀏覽器的時候,已經(jīng)給這些組件預(yù)留了空間。每當(dāng)瀏覽器啟動時,瀏覽器會首先在上述注冊表位置查看是否有注冊的BHO CLSID;如果有則分別創(chuàng)建一個實(shí)例,并對BHO實(shí)例進(jìn)行初始化,建立交互連接。(注:BHO實(shí)例只有在創(chuàng)建它的瀏覽器窗口銷毀時才被釋放。)下圖演示了BHO的創(chuàng)建過程:
o_bho.jpg
  成功創(chuàng)建的BHO,不僅可以得到各種標(biāo)準(zhǔn)的瀏覽器操作事件,并做出響應(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,生成一個項(xiàng)目名為BhoPlugin,其余均采用默認(rèn)設(shè)置。接著,我們就來分步詳細(xì)闡述。

  第一步,增加一個ATL Object到該項(xiàng)目中。VC菜單Insert->New ATL Object…,在彈出的對話框中選擇“Internet Explorer Object”,輸入COM類名(在Short Name后輸入EyeOnIE,其它各項(xiàng)會自動生成)。完成后,我們可以看到CEyeOnIE類有一個基類IObjectWithSiteImpl,這個就是實(shí)現(xiàn)IObjectWithSite接口的模版類。

  第二步,實(shí)現(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實(shí)現(xiàn)如下:

?1STDMETHODIMP?CEyeOnIE::SetSite(IUnknown?*pUnkSite)
?2{
?3 USES_CONVERSION;
?4
?5 if?(pUnkSite)
?6 {
?7  mWebBrowser2?=?pUnkSite;
?8  if?(mWebBrowser2)
?9  {
10   return?RegisterEventHandler(TRUE);
11  }

12 }

13 return?E_FAIL;
14}

15
16HRESULT?CEyeOnIE::RegisterEventHandler(BOOL?inAdvise)
17{
18 CComPtr<IConnectionPoint>?spCP;
19 //?Receives?the?connection?point?for?WebBrowser?events
20 CComQIPtr<IConnectionPointContainer,?&IID_IConnectionPointContainer>?spCPC(mWebBrowser2);
21 HRESULT?hr?=?spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,?&spCP);
22 if?(FAILED(hr))
23  return?hr;
24
25 if?(inAdvise)
26 {
27  //?Pass?the?event?handlers?to?the?container
28  hr?=?spCP->Advise(reinterpret_cast<IDispatch*>(this),?&mCookie);
29 }

30 else
31 {
32  spCP->Unadvise(mCookie);
33 }

34 return?hr;?
35}
  我們可以看到,SetSite的參數(shù)實(shí)際上指向的是瀏覽器組件。在SetSite實(shí)現(xiàn)中,我們首先保存瀏覽器組件指針,然后將該BHO向?yàn)g覽器注冊為事件處理器。

  第三步,實(shí)現(xiàn)IDispatch接口方法。事件處理也就在IDispatch::Invoke中實(shí)現(xiàn)(各個事件的ID在ExDispID.h中定義)。BHO可能會接收到很多事件,但我們只需要響應(yīng)我們感興趣的那一部分。首先在EyeOnIE.h中增加該函數(shù)的聲明,在EyeOnIE.cpp的實(shí)現(xiàn)中,筆者試著響應(yīng)瀏覽器瀏覽一個地址之前發(fā)出的事件DISPID_BEFORENAVIGATE2,以此來實(shí)現(xiàn)簡單的網(wǎng)址過濾功能,代碼參考如下:

?1STDMETHODIMP?CEyeOnIE::Invoke(DISPID?dispidMember,REFIID?riid,?LCID?lcid,?
?2WORD?wFlags,?DISPPARAMS?*?pDispParams,?
?3VARIANT?*?pvarResult,EXCEPINFO?*?pexcepinfo,?
?4UINT?*?puArgErr)
?5{?
?6 USES_CONVERSION;
?7
?8 if?(!pDispParams)
?9  return?E_INVALIDARG;
10
11 switch?(dispidMember)
12 {
13  //
14  //?The?parameters?for?this?DISPID?are?as?follows:
15  //?[0]:?Cancel?flag?-?VT_BYREF|VT_BOOL
16  //?[1]:?HTTP?headers?-?VT_BYREF|VT_VARIANT
17  //?[2]:?Address?of?HTTP?POST?data?-?VT_BYREF|VT_VARIANT?
18  //?[3]:?Target?frame?name?-?VT_BYREF|VT_VARIANT?
19  //?[4]:?Option?flags?-?VT_BYREF|VT_VARIANT
20  //?[5]:?URL?to?navigate?to?-?VT_BYREF|VT_VARIANT
21  //?[6]:?An?object?that?evaluates?to?the?top-level?or?frame
22  //?WebBrowser?object?corresponding?to?the?event.?
23  //
24  case?DISPID_BEFORENAVIGATE2:
25  {
26   LPOLESTR?lpURL?=?NULL;
27   mWebBrowser2->get_LocationURL(&lpURL);
28   char?*?strurl;
29   if?(pDispParams->cArgs?>=?5?&&?pDispParams->rgvarg[5].vt?==?(VT_BYREF|VT_VARIANT))
30   {
31    CComVariant?varURL(*pDispParams->rgvarg[5].pvarVal);
32    varURL.ChangeType(VT_BSTR);
33    strurl?=?OLE2A(varURL.bstrVal);
34   }

35   if?(strstr(strurl,?"girl.com"))
36   {
37    *pDispParams->rgvarg[0].pboolVal?=?TRUE;
38    ::MessageBox(NULL,?_T("該網(wǎng)頁已被禁止!"),_T("Warning"),MB_ICONSTOP);
39    return?S_OK;
40   }

41   break;
42  }

43
44  case?DISPID_NAVIGATECOMPLETE2:
45   break;
46  case?DISPID_DOCUMENTCOMPLETE:
47   break;
48  case?DISPID_DOWNLOADBEGIN:
49   break;
50  case?DISPID_DOWNLOADCOMPLETE:
51   break;
52  case?DISPID_NEWWINDOW2:
53   break;
54  case?DISPID_QUIT:
55   RegisterEventHandler(FALSE);
56   break;
57  default:
58   break;
59 }

60
61 return?S_OK;
62}


  我們看到,當(dāng)用戶瀏覽的新地址包含"girl.com"字符的時候,瀏覽器就會彈出一個警告對話框,并且停止進(jìn)一步的動作。另外值得注意的是,在DISPID_QUIT事件(瀏覽器將要退出)的響應(yīng)中,我們將BHO事件處理器進(jìn)行了注銷。

  第四步,因?yàn)锽HO可能會被文件瀏覽器加載。如果我們不想這樣,我們就要在DllMain中對加載者進(jìn)行判斷,參考如下:

?1extern?"C"
?2BOOL?WINAPI?DllMain(HINSTANCE?hInstance,?DWORD?dwReason,?LPVOID?/*lpReserved*/)
?3{
?4 if?(dwReason?==?DLL_PROCESS_ATTACH)
?5 {
?6  //?Check?who's?loading?us.?
?7  //?If?it's?Explorer?then?"no?thanks"?and?exit
?8  TCHAR?pszLoader[MAX_PATH];
?9  GetModuleFileName(NULL,?pszLoader,?MAX_PATH);
10  _tcslwr(pszLoader);
11  if?(_tcsstr(pszLoader,?_T("explorer.exe")))?
12   return?FALSE;
13
14  _Module.Init(ObjectMap,?hInstance,?&LIBID_BHOPLUGINLib);
15  DisableThreadLibraryCalls(hInstance);
16 }

17 else?if?(dwReason?==?DLL_PROCESS_DETACH)
18  _Module.Term();
19  return?TRUE;?//?ok
20}


  最后,別忘了修改注冊表文件,追加BHO的注冊信息。在EyeOnIE.rgs文件的下面增加如下代碼:

?1HKLM
?2{
?3 SOFTWARE
?4 {
?5  Microsoft
?6  {
?7   Windows
?8   {
?9    CurrentVersion
10    {
11     Explorer
12     {
13      'Browser?Helper?Objects'
14      {
15       {6E28339B-7A2A-47B6-AEB2-46BA53782379}
16      }

17     }

18    }

19   }

20  }

21 }

22}


  注意,{6E28339B-7A2A-47B6-AEB2-46BA53782379}是筆者這個BHO的CLSID,如果你自己開發(fā)BHO,這里應(yīng)該正確填寫你的CLSID。

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

posted on 2006-12-11 15:49 編程之道 閱讀(962) 評論(0)  編輯 收藏 引用 所屬分類: C/C++開發(fā)相關(guān)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            羞羞色国产精品| aa级大片欧美三级| 国产主播一区二区三区| 国产精品成人播放| 欧美性理论片在线观看片免费| 免费美女久久99| 久久在线视频在线| 亚洲理论在线观看| 欧美在线视频二区| 欧美一级理论性理论a| 欧美一区二区三区四区在线观看地址| 欧美一区在线视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产视频不卡| 欧美激情成人在线视频| 亚洲影院在线| 亚洲国产美女| 欧美国产一区二区在线观看 | 国产精品午夜久久| 国产主播一区二区三区| 亚洲国产精品成人精品| 亚洲少妇诱惑| 亚洲国产欧美一区二区三区丁香婷| 一区二区在线观看av| 亚洲精品美女久久7777777| 国产亚洲欧美日韩日本| 欧美成熟视频| 亚洲图片你懂的| 久久婷婷久久| 亚洲一区影音先锋| 亚洲国产视频一区| 久久久亚洲精品一区二区三区| 亚洲看片免费| 国产一区二区三区成人欧美日韩在线观看 | 国产日韩在线一区二区三区| 黄色成人在线观看| 亚洲一二区在线| 亚洲精选中文字幕| 欧美在线观看一区| 日韩一区二区福利| 裸体一区二区| 国产精品视频一二三| 99re6这里只有精品| 久久久久网站| 亚洲综合日韩在线| 欧美视频在线一区| 日韩一本二本av| 欧美承认网站| 欧美国产精品劲爆| 午夜精品一区二区三区电影天堂 | 国产婷婷色一区二区三区| 欧美日韩另类视频| 尤妮丝一区二区裸体视频| 1769国内精品视频在线播放| 精品69视频一区二区三区| 亚洲男人的天堂在线| 亚洲人人精品| 中文在线资源观看网站视频免费不卡| 久久嫩草精品久久久久| 国产日韩一级二级三级| 性伦欧美刺激片在线观看| 中文精品视频一区二区在线观看| 亚洲免费视频网站| 国产精品地址| 国产综合色精品一区二区三区| 国产一区二区毛片| 久久精品一区二区三区中文字幕| 久热综合在线亚洲精品| 香蕉免费一区二区三区在线观看| 久久欧美肥婆一二区| 欧美日韩亚洲一区二区三区在线 | 欧美极品aⅴ影院| 国产在线观看一区| 久久久午夜视频| 欧美韩日一区二区| 日韩午夜电影在线观看| 亚洲一区二区在线免费观看视频| 欧美伊人久久久久久久久影院| 欧美体内she精视频在线观看| av成人动漫| 9色精品在线| 欧美在线观看网站| 国内一区二区三区在线视频| 另类天堂av| 欧美—级高清免费播放| 国产日韩精品电影| 性娇小13――14欧美| 牛人盗摄一区二区三区视频| 日韩视频免费观看| 久久久噜噜噜久噜久久| 欧美久久精品午夜青青大伊人| 欧美性猛交一区二区三区精品| 亚洲一区久久久| 久久精品一区二区三区不卡牛牛| 欧美一二三视频| 最新国产の精品合集bt伙计| 99视频在线观看一区三区| 国产欧美日韩视频一区二区| 久久综合伊人77777蜜臀| 欧美精品成人91久久久久久久| 国产日韩三区| 亚洲欧美中文日韩v在线观看| 亚洲综合导航| 一区二区三区亚洲| 在线中文字幕一区| 一本色道久久综合精品竹菊 | 亚洲美女在线观看| 国产美女一区二区| 亚洲国产mv| 免费成人av资源网| 国产一区二区视频在线观看| 亚洲视频在线观看三级| 欧美在线免费| 亚洲午夜三级在线| 免费在线播放第一区高清av| 国产一区美女| 日韩一二三在线视频播| 欧美日韩国产限制| 美女日韩欧美| 国产亚洲成精品久久| 久久精品视频在线播放| 欧美日韩一区二区三区四区在线观看| 久久久久女教师免费一区| 久久er99精品| 激情综合色综合久久综合| 一本大道久久精品懂色aⅴ| 欧美一区二区三区在线观看视频| 麻豆九一精品爱看视频在线观看免费| 午夜精品视频一区| 亚洲小说春色综合另类电影| 亚洲福利视频免费观看| 亚洲高清资源综合久久精品| 国产综合激情| 欧美资源在线观看| 久久精品欧美日韩精品| 久久精品一区中文字幕| 亚洲免费影视| 国产精品久久久久国产精品日日 | 欧美国产激情| 在线视频精品一| 欧美成人午夜免费视在线看片 | 亚洲国产成人porn| 久久久亚洲影院你懂的| 久久亚洲高清| 亚洲二区在线| 日韩视频一区二区| 亚洲精品美女91| 欧美日韩成人一区二区三区| 亚洲国产视频a| 亚洲一区www| 久久久久国产一区二区三区四区 | 欧美破处大片在线视频| 一本一本久久| 亚洲综合成人婷婷小说| 亚洲综合色婷婷| 国产精品久久九九| 亚洲午夜精品视频| 久久成人免费| 欧美1区视频| 99在线热播精品免费99热| 浪潮色综合久久天堂| 亚洲第一精品在线| 国产精品高精视频免费| 亚洲一区二区三区在线| 欧美亚洲一区三区| 国内外成人免费视频 | 欧美午夜一区二区福利视频| 在线综合亚洲| 久热精品在线| 国产精品一区二区你懂得| 欧美在线播放| 亚洲精品日韩综合观看成人91 | 亚洲欧洲一区二区在线观看| 国产精品一区三区| 91久久精品国产91久久性色tv| 国产欧美一区二区精品忘忧草| 欧美成人免费视频| 国产精品无码永久免费888| 欧美一级视频精品观看| 欧美激情一区在线| **网站欧美大片在线观看| 欧美成人性网| 欧美寡妇偷汉性猛交| 夜夜嗨av一区二区三区四区| 亚洲精品资源| 欧美激情按摩在线| 亚洲综合色网站| 欧美国产日韩二区| 亚洲一区二区四区| 尤物精品在线| 国产精品白丝jk黑袜喷水| 欧美色道久久88综合亚洲精品| 99www免费人成精品| 久久人人超碰| 亚洲一二三区在线观看| 在线精品一区| 国产日韩欧美日韩| 亚洲成人在线网站| 午夜国产精品影院在线观看| 欧美三级午夜理伦三级中文幕 |