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

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

VC++開發BHO插件——定制你的瀏覽器

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

  BHO(Browser Help Objects),是實現了特定接口的COM組件。開發好的BHO插件在注冊表特定的位置注冊好后,每當微軟的瀏覽器啟動,BHO實例就會被創建。在瀏覽器工作的工程中,BHO會接收到很多事件,比如瀏覽器瀏覽新的地址、前進或后退、生成新的窗口、瀏覽器退出等等;BHO可以在這些事件的響應中實現與瀏覽器的交互。
 
  下面,我們首先來介紹一下BHO的工作原理。上面我們已經提到,BHO是COM組件,而且一定實現了IObjectWithSite接口。這些組件除了在注冊表中注冊為COM Server外,還必須將它們的CLSID在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\Explorer\Browser Helper Objects下注冊為子鍵。微軟在設計瀏覽器的時候,已經給這些組件預留了空間。每當瀏覽器啟動時,瀏覽器會首先在上述注冊表位置查看是否有注冊的BHO CLSID;如果有則分別創建一個實例,并對BHO實例進行初始化,建立交互連接。(注:BHO實例只有在創建它的瀏覽器窗口銷毀時才被釋放。)下圖演示了BHO的創建過程:
o_bho.jpg
  成功創建的BHO,不僅可以得到各種標準的瀏覽器操作事件,并做出響應;還可以定制瀏覽器的菜單、工具條等界面元素;更或者可以安裝鉤子函數,監視瀏覽器的一舉一動。值得注意的是,使用BHO插件,Internet瀏覽器要求在4.0以上版本;如果是文件瀏覽器,操作系統要求是Windows 95/98/2000或Window NT 4.0以上版本,并且Shell的版本在4.71以上。下面是支持BHO特性的系統一覽表:

Shell版本 操作系統版本 支持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和文件瀏覽器

  接下去,筆者就來介紹一下如何開發BHO插件,開發環境為VC6.0(使用ATL),安裝Platform SDK中的Internet Development SDK。首先,啟動VC的ATL COM AppWizard,生成一個項目名為BhoPlugin,其余均采用默認設置。接著,我們就來分步詳細闡述。

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

  第二步,實現IObjectWithSite的接口方法。在這之前,我們要先定義幾個成員變量:CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> mWebBrowser2,(需要加入#include "ExDisp.h"),用以保存瀏覽器組件的指針;DWORD mCookie,用以保存與瀏覽器的連接ID。IObjectWithSite有兩個接口方法:SetSite和GetSite。我們只需重載SetSite就行了。在EyeOnIE.h中增加函數聲明STDMETHOD(SetSite)(IUnknown *pUnkSite),在EyeOnIE.cpp實現如下:

?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的參數實際上指向的是瀏覽器組件。在SetSite實現中,我們首先保存瀏覽器組件指針,然后將該BHO向瀏覽器注冊為事件處理器。

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

?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("該網頁已被禁止!"),_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}


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

  第四步,因為BHO可能會被文件瀏覽器加載。如果我們不想這樣,我們就要在DllMain中對加載者進行判斷,參考如下:

?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,如果你自己開發BHO,這里應該正確填寫你的CLSID。

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区的| 老司机午夜精品视频| 亚洲第一网站| 宅男噜噜噜66一区二区 | 亚洲综合色在线| 老色鬼精品视频在线观看播放| 欧美在线观看你懂的| 精品福利av| 欧美激情小视频| 亚洲一区二区黄色| 亚洲第一主播视频| 亚洲欧洲精品一区二区精品久久久| 亚洲在线视频网站| 国产一区二区日韩精品| 欧美福利电影网| 欧美一区二区高清| 久久久亚洲高清| 亚洲视频在线二区| 亚洲黄色成人| 蜜桃av噜噜一区二区三区| 在线视频欧美一区| 国一区二区在线观看| 欧美亚男人的天堂| 久久综合一区| 午夜亚洲精品| 一区二区三区视频观看| 亚洲第一成人在线| 亚洲视频一区二区免费在线观看| 欧美亚洲免费电影| 欧美精品二区| 国户精品久久久久久久久久久不卡 | 欧美三级电影精品| 久久综合色综合88| 欧美日韩一区二区三区高清| 免费欧美视频| 欧美波霸影院| 女主播福利一区| 国产拍揄自揄精品视频麻豆| 国产精品扒开腿做爽爽爽视频| 激情文学综合丁香| 亚洲综合视频网| 欧美成人午夜激情视频| 国内精品一区二区| 亚洲人体一区| 亚洲人成亚洲人成在线观看| 亚洲欧美文学| 亚洲欧美成人网| 一区二区三区高清不卡| 久久九九国产精品怡红院| 亚洲欧美日韩区| 亚洲日本免费| 另类人畜视频在线| 激情综合五月天| 欧美在线亚洲| 欧美国产在线电影| 亚洲精品色婷婷福利天堂| 亚洲精一区二区三区| 久久亚洲精选| 欧美日韩国产一区精品一区 | 亚洲美女在线看| 一区二区三区蜜桃网| 欧美精品尤物在线| 国产精品久久久一本精品| 国产精品久久久久久久久久免费| 国产精品毛片| 亚洲永久在线观看| 一区二区三区国产盗摄| 欧美日韩精品免费| 在线亚洲欧美| 99视频在线精品国自产拍免费观看| 亚洲欧美日韩网| 久久视频在线视频| 亚洲高清色综合| 亚洲特级毛片| 久久夜色精品国产欧美乱| 亚洲欧洲中文日韩久久av乱码| 欧美岛国激情| 亚洲无人区一区| 欧美成人一区二区三区| 蜜桃av噜噜一区| 国产日韩欧美不卡| 91久久久久| 亚洲精品欧美极品| 国产精品久久久久毛片大屁完整版 | 亚洲第一天堂无码专区| 亚洲一级黄色片| 亚洲一区在线视频| 国产欧美成人| 欧美xxx成人| 欧美亚洲综合另类| 亚洲国产高清aⅴ视频| 亚洲免费观看高清完整版在线观看熊| 国产精品久久久久久久久动漫| 久久精品视频播放| 久久精品亚洲| 欧美一区二区三区在线观看| 欧美三级网址| 久久久久网址| 亚洲欧美日韩国产精品| 国内综合精品午夜久久资源| 亚洲高清色综合| 国产精自产拍久久久久久| 一区二区日本视频| 性刺激综合网| 夜夜夜精品看看| 最新国产成人av网站网址麻豆| 欧美日韩专区| 欧美国产一区二区| 国产精品免费视频观看| 亚洲国产mv| 狠狠入ady亚洲精品| 日韩一级黄色大片| 在线成人h网| 久久久久久久欧美精品| 欧美啪啪一区| 免费久久99精品国产自在现线| 国产精品毛片在线看| 亚洲精品日本| 亚洲精品看片| 亚洲久色影视| 亚洲高清资源综合久久精品| 午夜精品亚洲| 亚洲综合二区| 欧美日韩在线亚洲一区蜜芽| 亚洲成人在线视频网站| 欧美日韩成人在线| 欧美大片免费| 黄色国产精品| 欧美一区二区在线免费播放| 午夜久久99| 国产精品日韩专区| 另类av导航| 国产在线精品二区| 欧美主播一区二区三区| 亚洲丰满少妇videoshd| 欧美一区二区成人| 久久国产夜色精品鲁鲁99| 国产精品性做久久久久久| 一个色综合导航| 亚洲一卡久久| 国产精品久久久久高潮| 在线一区欧美| 欧美一区激情视频在线观看| 国产精品综合| 欧美在线观看网站| 久热这里只精品99re8久| 在线观看av不卡| 久久综合色8888| 91久久精品国产91性色| 在线一区免费观看| 国产精品久在线观看| 亚洲免费影视第一页| 久久精品国产一区二区电影| 国内在线观看一区二区三区| 卡通动漫国产精品| 亚洲激情在线观看| 亚洲小视频在线观看| 国产精品夜夜夜一区二区三区尤| 亚洲欧美久久久久一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 在线 亚洲欧美在线综合一区| 国产一区欧美| 亚洲精品在线一区二区| 亚洲网站啪啪| 国产伦精品一区二区三区高清版| 午夜久久美女| 欧美大片一区| 亚洲一区二区三区精品在线观看| 国产乱码精品一区二区三区忘忧草 | 在线看国产日韩| 久久嫩草精品久久久精品| 欧美激情影音先锋| 久久免费黄色| 国产精品每日更新在线播放网址| 久久久蜜臀国产一区二区| 欧美激情综合五月色丁香小说| 在线亚洲自拍| 久久性色av| 久久av一区二区| 欧美日韩一区二区在线观看视频 | 欧美精品色一区二区三区| 欧美在线观看一二区| 欧美一区影院| 亚洲国产婷婷香蕉久久久久久99| 免费日韩成人| 久久久久久久久伊人| 亚洲人成在线播放| 午夜精品在线| 亚洲卡通欧美制服中文| 欧美aⅴ99久久黑人专区| 一区二区三区免费看| 欧美大片va欧美在线播放| 亚洲欧美激情一区二区| 亚洲激情另类| 国产一区二区三区直播精品电影| 欧美日韩在线另类| 欧美大片一区二区| 久久久999国产| 亚洲欧美中日韩| 99国产精品99久久久久久粉嫩|