C++中使用BHO来屏蔽特定网站
开发者在线 Builder.com.cn 更新时间:2007-10-27作者:谢启东编译 来源:天极开发
本文关键词: c++ BHO 屏蔽 网站
如果在系统中打开了活动桌面,BHO也能随同Windows Explorer一起启动。如果不想在Windows Explorer中运行BHO,可将如下代码添加到DLLMain中:
TCHAR strLoader[MAX_PATH];
::GetModuleFileName (NULL, strLoader, MAX_PATH); |
BHO的COM Server必须实现IObjectWithSite,以便对象可以挂钩到浏览器事件,Internet Explorer会依靠IObjectWithSite将一个指针传递到它的IUnknown接口,所以,只需实现IObjectWithSite的SetSite方法就行了,如下所示:
STDMETHODIMP CBhoApp::SetSite(IUnknown *pUnkSite) { //获取并存储IWebBrowser2指针 m_spWebBrowser2 = pUnkSite; if (m_spWebBrowser2 == NULL) return E_INVALIDARG; //获取并存储IConnectionPointerContainer指针 //连接到宿主程序以接收事件通知 |
以下是Connect函数比较简单的实现:
HRESULT CBhoApp::Connect() { HRESULT hr; CComPtr<IConnectionPoint> spCP; //获取访问WebBrowser事件的连接指针 //把事件处理程序传递给宿主程序Each time an event |
通过调用Advise方法,告之浏览器BHO想要接受事件通知,这意味着BHO会把指向IDispatch的指针提供给浏览器(这是由于要进行组件事件处理),接下来,浏览器会调用IDispatch的Invoke方法,并传递给它一个事件的ID作为参数,因此,BHO必须实现Invoke方法以处理所发生的事件。
STDMETHODIMP CBhoApp::Invoke(DISPID dispidMember,REFIID riid, LCID lcid,WORD wFlags, DISPPARAMS *pDispParams,VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { //在使用ATL字符串转换宏(此处用的是OLE2T)防止编译错误时,必须先调用这个宏 USES_CONVERSION; if(dispidMember == DISPID_BEFORENAVIGATE2) LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)]; //此处,直接比较www.xyz.com,也可从一个要屏蔽的网站列表中进行比较。 //如果不想显示"空白页",也可重定向至某个表明此网站已被屏蔽的页面。 //把文本从Unicode转换为ANSI |
还需修改工程的.rgs文件,依据所定格式添加以下注册表项:
HKLM SOFTWAREMicrosoftWindowsCurrentVersionExplorerBrowser Helper Objects ForceRemove |
在编译完成后,使用regsvr32注册组件,如果想卸载,只需在regsvr32后带上/u。