乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      CSDN技術(shù)中心 VC++開發(fā)BHO插件——定制你的瀏覽器

       accesine 2005-09-22
        VC++開發(fā)BHO插件——定制你的瀏覽器     選擇自 zharP 的 Blog
      關(guān)鍵字   VC++開發(fā)BHO插件——定制你的瀏覽器
      出處  

      原作者姓名 陸其明
      文章原始出處 http://hqtech.

      正文
      在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插件在注冊表特定的位置注冊好后,每當(dāng)微軟的瀏覽器啟動,BHO實例就會被創(chuàng)建。在瀏覽器工作的工程中,BHO會接收到很多事件,比如瀏覽器瀏覽新的地址、前進或后退、生成新的窗口、瀏覽器退出等等;BHO可以在這些事件的響應(yīng)中實現(xiàn)與瀏覽器的交互。

      下面,我們首先來介紹一下BHO的工作原理。上面我們已經(jīng)提到,BHO是COM組件,而且一定實現(xiàn)了IObjectWithSite接口。這些組件除了在注冊表中注冊為COM Server外,還必須將它們的CLSID在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\Explorer\Browser Helper Objects下注冊為子鍵。微軟在設(shè)計瀏覽器的時候,已經(jīng)給這些組件預(yù)留了空間。每當(dāng)瀏覽器啟動時,瀏覽器會首先在上述注冊表位置查看是否有注冊的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ā)出的事件DISPID_BEFORENAVIGATE2,以此來實現(xiàn)簡單的網(wǎng)址過濾功能,代碼參考如下:
      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;
      }
      我們看到,當(dāng)用戶瀏覽的新地址包含"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開發(fā)完成了。(可以到本人的個人主頁 http://hqtech. 下載實例源代碼。)BHO插件可以實現(xiàn)的功能還有很多,比如網(wǎng)頁內(nèi)容分析、IE界面定制等等。作為總結(jié),筆者還要提醒讀者一點的是,如果不想讓BHO起作用了,可以注銷該插件,如下格式:regsvr32 /u yourpath\yourbho.dll,或者直接在注冊表中將“Browser Helper Objects”目錄下注冊的CLSID刪掉。
      正文完


      相關(guān)文章

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多