Web Site Blocker that Uses Browser Helper Objects (BHO)
来源:互联网 发布:黑马程序员到底有多黑 编辑:程序博客网 时间:2024/05/07 02:29
BHO is a simple ATL COM object that Internet Explorer will load each time it runs; in other words, for every instance of Internet Explorer. BHOs run in Internet Explorer's address space and can perform any operations on available objects (windows, modules, and so forth). BHOs instantiate and get destructed with a browser's instance because it is tied to a browser's main window.
If your system has an active desktop enabled, the BHO gets instantiated along with Windows Explorer as well. To disable the BHO for Windows Explorer, you can add following code snippet to DllMain:
TCHAR strLoader[MAX_PATH];
::GetModuleFileName (NULL, strLoader, MAX_PATH);
if(stricmp("explorer.exe", strLoader) == 0)
return FALSE;
BHO's COM Server must implement IObjectWithSite to help your object hook on the browser's events. Internet Explorer will pass a pointer to its IUnknown interface by the means of IObjectWithSite. Only the SetSite method of IObjectWithSite will need to be implemented, as follows:
STDMETHODIMP CBhoApp::SetSite(IUnknown *pUnkSite)
{
// Retrieve and store the IWebBrowser2 pointer
m_spWebBrowser2 = pUnkSite;
if (m_spWebBrowser2 == NULL)
return E_INVALIDARG;
// Retrieve and store the IConnectionPointerContainer pointer
m_spCPC = m_spWebBrowser2;
if (m_spCPC == NULL)
return E_POINTER;
// Connect to the container to receive event notifications
return Connect();
}
Here, the connect function would look like the following:
HRESULT CBhoApp::Connect()
{
HRESULT hr;
CComPtr<IConnectionPoint> spCP;
// Receives the connection point for WebBrowser events
hr = m_spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP);
if (FAILED(hr))
return hr;
// Pass our event handlers to the container. Each time an event
// occurs the container will invoke the functions of the
// IDispatch interface we implemented.
hr = spCP->Advise(reinterpret_cast<IDispatch*>(this),&m_dwCookie);
return hr;
}
By calling the Advise method, you tell the browser that BHO would be eager to receive notifications about events. This means that BHO will provide the browser with the pointer to IDispatch (this is due to Component's event handling). The browser then calls IDispatch's Invoke method and passes it the ID of an event as an argument. So, your BHO must implement the Invoke method to handle the events.
STDMETHODIMP CBhoApp::Invoke(DISPID dispidMember,REFIID riid,
LCID lcid,WORD wFlags,
DISPPARAMS *pDispParams,VARIANT
*pvarResult, EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
USES_CONVERSION; // This macro should be called when using
// ATL string conversion macros to avoid
// compile time errors (here we are using OLE2T)
if(dispidMember == DISPID_BEFORENAVIGATE2)
{
BSTR bstrUrlName;
HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
if(FAILED(hr))
return hr;
LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
lstrcpy(psz, OLE2T(bstrUrlName));
// Here, I am directly comparing with xyz.com. You can
// maintain a list of all sites to be blocked and then compare.
// Or, you can also keep this data in a database, but I guess
// that might affect the performance.
// (Experts! please comment on this.)
if(stricmp("http://www.xyz.com/",psz) == 0)
// Here, you also can use strstr instead of stricmp;
// this will help allow all domains originating from xyz.
{
VARIANT vFlags = {0},vTargetFrameName = {0};
// Instead of "about:blank", you can redirect user to some
// page saying site has been blocked. :-)
m_spWebBrowser2->Navigate(SysAllocString(L"about:blank"),
&vFlags,&vTargetFrameName,
NULL,NULL);
m_spWebBrowser2->put_Visible(VARIANT_TRUE);
return S_FALSE;
}
return S_OK;
}
else if(dispidMember == DISPID_NAVIGATECOMPLETE2)
// This checking is done to avoid post-navigation loading of a page.
{
BSTR bstrUrlName;
HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
if(FAILED(hr))
return hr;
// Convert the text from Unicode to ANSI
LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
lstrcpy(psz, OLE2T(bstrUrlName));
::OutputDebugString("In Navigate Complete");
::OutputDebugString(psz);
if(stricmp("http://www.xyz.com/",psz) == 0)
{
VARIANT vFlags = {0},vTargetFrameName = {0};
m_spWebBrowser2->Navigate(SysAllocString(L"about:blank"),
&vFlags,&vTargetFrameName,
NULL,NULL);
m_spWebBrowser2->put_Visible(VARIANT_TRUE);
}
return S_OK;
}
return S_FALSE;
}You also need to change the .rgs file of your project. Add the following code snippet to it:
HKLM
{
SOFTWARE
{
Microsoft
{
Windows
{
CurrentVersion
{
Explorer
{
'Browser Helper Objects'
{
ForceRemove {0CB66BA8-5E1F-4963-93D1-E1D6B78FE9A2}
}
}
}
}
}
}
}Using the Code
Once
you are done with the compilation, use regsvr32 to register your
component. Whenever you want to disable the BHO, simply use regsvr32
with the /u option. One also can provide a simple UI to do this.Improvements
A UI element could be added to add a URL to the list of "sites to be blocked."
References
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwebgen/html/bho.asp.
Downloads
BhoNew_src.zip - Source Code
- Web Site Blocker that Uses Browser Helper Objects (BHO)
- Browser Helper Objects: The Browser...
- 什么叫Browser Helper Object (BHO)
- 浏览器插件-- Browser Helper Object(BHO)
- BHO(Browser Helper Object )简单介绍
- c# IE插件 Browser Helper Object (BHO)
- BHO(Browser Helper Object,浏览器辅助对象,简称BHO)
- Browser Helper Objects: The Browser the Way You Want It
- Browser Helper Objects: The Browser the Way You Want It
- Building Browser Helper Objects with Visual Studio 2005
- Write a Servlet Application that uses a cookie to track the number of times a user visits a web site
- Prevent a Browser Helper Object (BHO) from loading with Explorer.exe instances
- How to attach to Browser Helper Object (BHO) with C# in two minutes
- emule browser BHO
- A web site that introduce jargon
- This site uses a plugin (application/baiducnff-activex)that is not supported 解决办法
- IE browser use URL to login web site
- IE browser use URL to login web site
- 强奸女大学生的各种反应{经典} !!血强
- 技术起点以及期望
- 没有钱,我们能爱多久?
- 第一次上课有感
- ExeShield Deluxe 1.3 RC
- Web Site Blocker that Uses Browser Helper Objects (BHO)
- 女生最想泡的十二种男生!
- 开源通讯框架Mina读后感系列(-)
- 男人不知道的十六件事——看后有点愧疚!!!
- 中国行业信息化作用报告
- 读取properties文件的例子.
- SAX解析XML的例子.
- 我们的未来如何?
- 给IT销售人员一点经验