首页 > 编程知识 正文

钢琴初学入门(BHO入门)

时间:2023-05-06 16:37:11 阅读:121484 作者:4084

浏览器辅助对象,全称BrowserHelperObject,以下简称BHO是常见的IE浏览器插件。 这是微软作为浏览器对第三方程序员开放交互接口的业界标准发售的,利用BHO的交互界面,可以在加载IE浏览器的同时进行适当的IE控制处理,或者加载其他程序,与IE浏览器进行交互

BHO的目的是让程序员构建个性化的浏览器,为程序提供更简洁的交互功能。 目前,许多IE个性化工具都是利用BHO实现的。 符合BHO接口标准的程序代码以DLL动态链接库的形式注册为注册表中的COM对象,还在BHO接口的注册表入口注册组件。 然后,每次IE启动时,都会通过这里介绍的注册信息调用加载此DLL文件,该DLL文件成为IE的模块(BHO组件),并共享执行周期直到IE关闭。

目前,BHO技术已经广泛应用于网络程序的开发中,实现的功能也多种多样,包括网络内容过滤、自动填写、广告拦截、网络行为监控、网络翻译等功能。 百度工具栏、迅雷等众所周知的软件都使用了BHO技术,很多病毒、木马、流氓软件也在使用这种技术。 当然,消除它们的杀毒软件、扑杀工具也必须利用这一技术

BHO是实现特定接口的COM组件。 开发的BHO插件在注册表的特定位置注册后,每当微软浏览器启动时都会创建一个BHO实例。 在浏览器工作的项目中,BHO接受很多事件,包括浏览器浏览新地址、前进、返回、生成新窗口以及浏览器退出BHO为在这些事件的响应中实现与浏览器的交互

那么,首先介绍一下BHO的工作原理吧。 如上所述,BHO是COM组件,而且一定实现了IObjectWithSite接口这些组件除了在注册表中注册为COM Server之外,还将CLSID注册为HKEY _ local _ machine/soff

微软在设计浏览器时,为这些组件留出了空间。 每次浏览器启动时,浏览器首先检查是否有在上述注册表位置注册的BHO CLSID; 如果有,请创建各自的实例,初始化BHO实例以建立互连。 注:只有在创建的浏览器窗口被销毁时,才会释放BHO实例。 )

原理IE把自己的IUnKnown指针给BHO,BHO是私有的基于COM的通讯通道,目的是响应IE事件,所以BHO是IObjectWithSite接口(站点对象接口)IE通过这个接口,把自己的IUnKnown接口

在IE启动时依次运行几个函数,在此注册BHO自己的函数。 书面上称为连接点。 这样就可以进入BHO自己的程序内部了。 IObjectWithSite主要有两个函数。

hresultsetsite (Iunknown * punk site )接收ie浏览器的I unknown指针。 典型的实现是保存指针以备将来使用。 从由hresultgetsite(refiidriid,void** ppvSite )方法设置的位置接收并返回指定的接口。 一种典型实现是查询先前存储的接口指针以进一步获得成功创建指定接口的BHO,而不仅仅是获得和响应各种标准浏览器操作事件。 也可以自定义界面元素,如浏览器菜单和工具栏; 或者,也可以安装挂接函数来监视浏览器的一举一动。 值得注意的是,要使用BHO插件,互联网浏览器的要求是4.0或更高版本。 对于文件浏览器,操作系统要求为Windows 95/98/2000或Window NT 4.0或更高,shell版本为4.71或更高。 以下是支持BHO特性的系统列表。

外壳版本操作系统版本支持BHO

4.00 windows 95 and windows nt 4.0 (IE4.0版)仅限ie 4.0

4.71 windows 95 and windows nt 4.0 (ie版本为4.0 ) ie ) Explorer.exe (internet explorer )和文件浏览器(explorer.exe ) )。

4.72 Windows 98

                                               IE和文件浏览器
5.00               Windows 2000                                                                             IE和文件浏览器

使用BHO

首先建立一个ATL项目

下一步,直接完成即可

其次呢,就是添加一个ATL简单对象,如下图所示

然后呢,就是添加ATL简单对象的过程

下一步,如下图所示

只需要填入简称,其他就会自动填好,这样就好,然后点击下一步,->下一步

需要注意的就是支持那一栏IObjectWithSite一定要勾上!!!

然后呢,就是创建类的成员变量和类的成员函数

STDMETHOD(SetSite)(IUnknown*p);CComQIPtr<IWebBrowser2,&IID_IWebBrowser2>m_spWebBrowser;HRESULT Connect(BOOL);DWORD m_cookie;STDMETHODIMP Invoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pvarResult,EXCEPINFO * pexcepinfo, UINT * puArgErr);

其实,SetSite是IObjectWithSite接口的成员函数,然后呢,我们要将其记录下来,也就是IE浏览器的指针。然后再EyeOIE的cpp文件中写入如下代码

STDMETHODIMP CEyeOnIE::SetSite(IUnknown*pSite){m_spWebBrowser=pSite;if(m_spWebBrowser==NULL){return E_INVALIDARG;}return Connecnt(true);}HRESULT CEyeOnIE::Connect(BOOL pB){CComPtr<IConnectionPoint>spPC;CComQIPtr<IConnectionPointContainer,&IID_IConnectionPointContainer>spCPC(m_spWebBrowser);HRESULT hr=spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&spPC);if(FAILED(hr)){return hr;}if(pB){hr=spPC->Advise(reinterpret_cast<IDispatch*>(this),&m_cookie);}else{hr=spPC->Unadvise(m_cookie);}return hr;}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){case 250://DISPID_BEFORENAVIGATE2:break;case 252://DISPID_NAVIGATECOMPLETE2:break;case 259://DISPID_DOCUMENTCOMPLETE:::MessageBoxA(NULL,"dada",0,0);break;default:break;}return S_OK;}

其实SetSite和Connect两个函数就是两个功能,一个是记录下IE浏览器的指针,然后呢就是,将浏览器指针强制类型转换,变成连接点管理器,然后,由得到的连接点管理器获得连接点,根据连接点,激活IE浏览器和BHO之间的通信,这样就完成了基本的操作,然后呢就是一些其他与BHO功能本身无关的代码了,但也是必须的

在dllmain.cpp文件中加入

if (dwReason == DLL_PROCESS_ATTACH){TCHAR pszLoader[MAX_PATH];//返回调用者模块的名称,第一个参数应为NULL,详见msdn。GetModuleFileName(NULL, pszLoader, MAX_PATH);_tcslwr(pszLoader);if (_tcsstr(pszLoader, _T("explorer.exe")))return FALSE;}

这样就避免了文件管理器加载该BHO插件,然后呢就是寻找EyeOnIE.rgs文件中加入一个注册表输出

HKLM { NoRemove SOFTWARE { NoRemove Microsoft { NoRemove Windows { NoRemove CurrentVersion { NoRemove Explorer { NoRemove 'Browser Helper Objects' { ForceRemove '{851FBDE4-1953-4B58-AF94-5D072F1E9ED1}' = s 'EyeOnIEBHO' { val 'NoExplorer' = d '1' } } } } } } }}

上面加粗的内容呢就是该BHO的CLSID,该CLSID的定义在BhoPlugin.idl文件中,

将该文件中的CLSID替换掉EyeOnIE.rgs文件中即可,这样BHO的创建就完成了!!!

PS:::::我在进行网页信息的获取时,有时会将网页中的内容就录下来,想放在txt文档中,但是呢,代码是正确的,就是不执行,经过一系列的文件查找,发现必须使用管理员权限运行IE浏览器,才能执行,对于遇到同样问题的童鞋,予以提醒。

备注:

dll注册和反注册

regsvr32 D:workspace-ideaEyeOnIETrunkDebugEyeOnIEEyeOnIE.dll
regsvr32 /u D:workspace-ideaEyeOnIETrunkDebugEyeOnIEEyeOnIE.dll

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。