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

旅途

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

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_MACHINESOFTWAREMicrosoftWindows CurrentVersionExplorerBrowser Helper Objects下注冊為子鍵。微軟在設計瀏覽器的時候,已經給這些組件預留了空間。每當瀏覽器啟動時,瀏覽器會首先在上述注冊表位置查看是否有注冊的 BHO CLSID;如果有則分別創建一個實例,并對BHO實例進行初始化,建立交互連接。(注:BHO實例只有在創建它的瀏覽器窗口銷毀時才被釋放。)下圖演示 了BHO的創建過程:
說明 createbho.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實現如下:
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的參數實際上指向的是瀏覽器組件。在SetSite實現中,我們首先保存瀏覽器組件指針,然后將該BHO向瀏覽器注冊為事件處理器。
第三步,實現IDispatch接口方法。事件處理也就在IDispatch::Invoke中實現(各個事件的ID在ExDispID.h中定義)。 BHO可能會接收到很多事件,但我們只需要響應我們感興趣的那一部分。首先在EyeOnIE.h中增加該函數的聲明,在EyeOnIE.cpp的實現中, 筆者試著響應瀏覽器瀏覽一個地址之前發出的事件 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("該網頁已被禁止!"),_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事件(瀏覽器將要退出)的響應中,我們將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,如果你自己開發BHO,這里應該正確填寫你的CLSID。

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

posted on 2007-07-29 14:59 旅途 閱讀(1953) 評論(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>
            久久aⅴ国产欧美74aaa| 国产精品美女一区二区| 久久精品中文字幕免费mv| 久久亚洲精品欧美| 国产精品久久久久aaaa| 国内精品久久久久伊人av| 99精品国产99久久久久久福利| 性色av一区二区三区| 欧美国产91| 性色av香蕉一区二区| 欧美精品电影| 在线视频成人| 国内精品一区二区| 亚洲欧美日韩高清| 亚洲片在线资源| 欧美一区二区三区免费观看| 久久免费视频网站| 国产一区av在线| 亚洲一区三区电影在线观看| 亚洲盗摄视频| 亚洲欧美国产日韩中文字幕| 亚洲欧美在线看| 日韩视频在线一区| 欧美高清在线视频观看不卡| 在线观看亚洲| 免费观看久久久4p| 久久精品毛片| 好吊色欧美一区二区三区四区| 午夜精品久久久久久久久久久久| 亚洲伦理网站| 欧美日韩精品二区第二页| 国产日韩精品入口| 欧美一区影院| 久久国产精品一区二区| 极品av少妇一区二区| 91久久精品日日躁夜夜躁国产| 久久精品九九| 欧美在线关看| 亚洲电影自拍| 亚洲国产欧美国产综合一区| 欧美精品网站| 一区二区三区高清不卡| 99re6这里只有精品视频在线观看| 欧美精品www在线观看| 在线亚洲免费视频| 亚洲午夜一区二区| 国产日韩欧美亚洲一区| 久久久夜色精品亚洲| 久久欧美中文字幕| 伊大人香蕉综合8在线视| 蜜桃久久精品乱码一区二区| 午夜精品在线| 在线观看av不卡| 欧美激情一区二区三区高清视频 | 亚洲人人精品| 欧美一区二区三区婷婷月色 | 美女视频黄 久久| 韩国一区二区在线观看| 亚洲激情av| 国产精品入口福利| 国产精品女同互慰在线看| 影音先锋亚洲精品| 一区二区三区欧美成人| 国产日韩欧美自拍| 亚洲第一天堂av| 欧美日韩性生活视频| 欧美在线免费视屏| 欧美视频在线观看视频极品| 久久亚洲一区二区| 国产欧美精品久久| 中文在线资源观看网站视频免费不卡| 亚洲国产精品成人综合| 欧美一区二区三区精品电影| 亚洲午夜精品一区二区| 欧美成人中文| 欧美韩日亚洲| 一区二区视频免费完整版观看| 一本久道久久久| 一区二区三区精品视频在线观看| 免费不卡在线观看av| 久久久伊人欧美| 国产亚洲欧美另类中文| 亚洲综合三区| 欧美亚洲免费高清在线观看| 欧美三日本三级少妇三2023 | 欧美日韩在线播放三区| 亚洲高清三级视频| 亚洲国产日韩欧美在线动漫| 欧美一级欧美一级在线播放| 亚洲欧美变态国产另类| 国产精品久久国产精麻豆99网站| 99re成人精品视频| 一区二区三区四区五区精品| 欧美精品日韩| 99在线观看免费视频精品观看| 一本久久综合亚洲鲁鲁五月天| 欧美国产日韩视频| 日韩视频一区二区| 亚洲综合国产激情另类一区| 欧美午夜欧美| 亚洲女同同性videoxma| 久久久国产成人精品| 狠狠色狠色综合曰曰| 久久久久久久999| 欧美a级大片| 日韩午夜在线电影| 国产精品久久久久aaaa| 国产精品99久久久久久www| 性做久久久久久久免费看| 国产一区二区成人| 久久综合中文色婷婷| 亚洲人成网站999久久久综合| 亚洲网站视频| 国产亚洲精品aa午夜观看| 午夜日韩在线| 久久久高清一区二区三区| 欧美成人一区二区| 在线亚洲成人| 国内精品久久久久久久果冻传媒| 久久一区国产| 中国av一区| 免费在线观看成人av| 99国产精品视频免费观看一公开 | 欧美一二区视频| 在线观看欧美一区| 欧美日韩国产色综合一二三四 | 日韩视频在线永久播放| 亚洲无毛电影| 狠狠入ady亚洲精品| 欧美不卡高清| 亚洲免费在线观看| 欧美成人免费视频| 性色一区二区三区| 亚洲精品国产拍免费91在线| 国产精品激情偷乱一区二区∴| 久久午夜精品一区二区| 一本不卡影院| 欧美成人xxx| 亚洲欧美日韩直播| 亚洲裸体视频| 极品少妇一区二区三区| 欧美日韩在线一区二区| 久久在线免费| 亚洲免费小视频| 99国产一区| 亚洲福利视频网站| 久久成人在线| 亚洲尤物视频在线| 亚洲国产另类精品专区| 国产欧美va欧美va香蕉在| 欧美女同视频| 亚洲人成在线播放| 欧美在线网站| 久久久青草青青国产亚洲免观| 国产精品视屏| 久热综合在线亚洲精品| 欧美电影美腿模特1979在线看| 久久综合精品国产一区二区三区| 欧美在线播放高清精品| 亚洲一区二区影院| 欧美日韩国产欧| 久久久国产精品亚洲一区| 欧美一区二视频| 亚洲精品国产视频| 欧美激情一区二区三区| 午夜性色一区二区三区免费视频| 亚洲另类视频| 亚洲一区二区在| 一本色道久久综合亚洲二区三区| 欧美亚洲日本一区| 一区二区高清视频| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲国产精品久久| 亚洲理伦在线| 久久乐国产精品| 久久精品女人| 国产欧美日韩精品专区| 亚洲视频你懂的| 久久综合久久久久88| 久久婷婷国产麻豆91天堂| 夜夜嗨av色综合久久久综合网| 一区二区三区导航| 亚洲国产成人一区| 美女诱惑一区| 欧美日韩精品欧美日韩精品一 | 一区在线视频观看| 欧美成人免费va影院高清| 亚洲欧美日韩国产中文| 国产精品私拍pans大尺度在线| 亚洲精品一区二区三区蜜桃久 | 欲香欲色天天天综合和网| 麻豆国产精品777777在线| 国产精品久久久久久久免费软件 | 99国产精品久久久久老师| 久久久久一区二区| 亚洲免费视频一区二区| 永久域名在线精品| 欧美激情在线狂野欧美精品| 亚洲黄色成人网| 亚洲蜜桃精久久久久久久|