BHO入门

BHO入门浏览器辅助对象 全称 BrowserHelpe 以下简称 BHO 就是我们常说的 IE 浏览器插件 它是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准 利用 BHO 的交互接口 就可以在加载 IE 浏览器的同时进行相应的 IE 控制处理或加载其它程序 实现与 IE 浏览器的交互 BHO 的目的是为了更好的帮助程序员打造个性化浏览器 以及为程序提供更简洁的交互功能 现在很多 IE 个性化工具就是利用 BHO 的来实现 符合 BHO 接口标准的程序代码被写为 DLL 动态链接库形式

        浏览器辅助对象,全称BrowserHelperObject,以下简称BHO,就是我们常说的IE浏览器插件。它是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,利用BHO的交互接口,就可以在加载IE浏览器的同时进行相应的IE控制处理或加载其它程序,实现与IE浏览器的交互。       

       BHO的目的是为了更好的帮助程序员打造个性化浏览器,以及为程序提供更简洁的交互功能,现在很多IE个性化工具就是利用BHO的来实现。符合BHO接口标准的程序代码被写为DLL动态链接库形式在注册表里注册为COM对象,还要在BHO接口的注册表入口处进行组件注册,以后每次IE启动时都会通过这里描述的注册信息调用加载这个DLL文件,而这个DLL文件就因此成为IE的一个模块(BHO组件),与IE共享一个运行周期,直到IE被关闭。

        目前,BHO技术已经广泛应用于互联网程序开发中,实现的功能也多种多样,包括网页内容过滤、自动填单、广告拦截、上网行为监控、网页翻译等功能,大家熟知的软件像百度工具条、迅雷等工具都利用了BHO技术,甚至很多病毒、木马、流氓软件也都利用了这种技术,当然,清理它们的杀毒软件,专杀工具也要利用此技术,所以掌握这种技术对相关程序开发很有帮助。

        BHO是实现了特定接口的COM组件。开发好的BHO插件在注册表特定的位置注册好后,每当微软的浏览器启动,BHO实例就会被创建。在浏览器工作的工程中,BHO会接收到很多事件,比如浏览器浏览新的地址、前进或后退、生成新的窗口、浏览器退出等等;BHO可以在这些事件的响应中实现与浏览器的交互
       下面,我们首先来介绍一下BHO的工作原理。上面我们已经提到,BHO是COM组件,而且一定实现了IObjectWithSite接口。这些组件除了在注册表中注册为COM Server外,还必须将它们的CLSID在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/ CurrentVersion/Explorer/Browser Helper Objects下注册为子键 。
       微软在设计浏览器的时候,已经给这些组件预留了空间。每当浏览器启动时,浏览器会首先在上述注册表位置查看是否有注册的 BHO CLSID;如果有则分别创建一个实例,并对BHO实例进行初始化,建立交互连接。(注:BHO实例只有在创建它的浏览器窗口销毁时才被释放 。)




原理

        IE将自己的IUnKnown指针传递给BHO,BHO需要建立一个私有的基于COM的通讯通道,目的是响应IE事件。所以BHO最重要的是实现IObjectWithSite 接口(站点对象接口)。IE 通过这个接口,传递自己的IUnknown接口,BHO存储该接口,进一步通过调用IObjectWithSite 提供的方法

IE启动时候会依次执行一些函数,把BHO自己的函数注册到这里,书面上称之为连接点 。这样就能调用进入 BHO自己的程序内部了。IObjectWithSite 主要有两个函数要实现:

  • HRESULT SetSite(IUnknown* pUnkSite)  接收ie浏览器的IUnknown指针。典型实现是保存该指针以备将来使用 。
  • HRESULT GetSite(REFIID riid, void ppvSite)  从通过SetSite()方法设置的场所中接收并返回指定的接口,典型实现是查询前面保存的接口指针以进一步取得指定的接口

成功创建的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(iexplorer.exe,即internet explorer)和文件浏览器(Explorer.exe
4.72               Windows 98                                                                                 IE和文件浏览器
5.00               Windows 2000                                                                             IE和文件浏览器










使用BHO

首先建立一个ATL项目

BHO入门

下一步,直接完成即可

BHO入门

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

BHO入门

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

BHO入门

下一步,如下图所示

BHO入门

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

BHO入门

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

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

STDMETHOD(SetSite)(IUnknown*p); CComQIPtr 
  
    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 
  
    spPC; CComQIPtr 
   
     spCPC(m_spWebBrowser); HRESULT hr=spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&spPC); if(FAILED(hr)) { return hr; } if(pB) { hr=spPC->Advise(reinterpret_cast 
    
      (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文件中,

BHO入门

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

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

备注:

dll注册和反注册

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204052.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:07
下一篇 2026年3月19日 下午9:07


相关推荐

  • 圆周率的前十万亿位_圆周率算到60万亿位

    圆周率的前十万亿位_圆周率算到60万亿位3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644…

    2025年11月8日
    5
  • 如何用豆包上传两张图生成AI?

    如何用豆包上传两张图生成AI?

    2026年3月12日
    2
  • jsp常用标签有哪些_foreach js

    jsp常用标签有哪些_foreach js————————————-JSTL标签forEach———————————-forEach(重点)   forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。 <c:setvar="sum"value="…

    2025年7月22日
    4
  • 阿姨想让13岁的儿子学Java编程,我拒绝了

    阿姨想让13岁的儿子学Java编程,我拒绝了大家好,我是锋哥;先爆丑照,为了你们有勇气继续阅读下去;前一段时间,有个阿姨找我学java,我懵逼了。我以为阿姨学着玩玩的,我就同意了。她说过段时间找我报名;后来,阿姨又找我阿姨想让她13岁的儿子跟我学编程,我想了下13岁应该六年级或者初一,不正是学习科学文化基础知识的时候吗。我这人有原则,有底线,也不想坑人,孩子太小,应用编程真不适合,也会耗费大量的时间和精力,耽误学业。孩子学应用编程前,应该至少有初中毕业文化,计算机简单基础,英语基础,应用软件基础,如果可以,还需要了解计算机组成原

    2022年4月30日
    59
  • 瑞芯微rk3399pro_arm主板定制开发

    瑞芯微rk3399pro_arm主板定制开发深圳市宁远电子科技有限公司于2015年在中国广东省深圳市成立,公司自成立以来一直专注于工业嵌入式产品的软硬件研发和生产,以及相应的增值服务。公司拥有强大的研发技术实力,创始团队来自于华为,三星十年工作经验以上资深研发人员。  深圳市宁远电子科技有限公司专注于工来控制产品的研发,是ARM在中国最具实力的方案公司.  公司定位于中高端产品的研发,基于RK3288,RK3399等处理器,,开发了…

    2022年10月14日
    8
  • 【数学建模】元胞自动机

    【数学建模】元胞自动机最初的元胞自动机是由冯 诺依曼在 1950 年代为模拟生物细胞的自我复制而提出的 但是并未受到学术界重视 1970 年 剑桥大学的约翰 何顿 康威设计了一个电脑游戏 生命游戏 后 元胞自动机才吸引了科学家们的注意 1983 年 S Wolfram 发表了一系列论文 对初等元胞机 256 种规则所产生的模型进行了深入研究 并用熵来描述其演化行为 将细胞自动机分为平稳型 周期型 混沌型和复杂型 A 应用社会学 元胞自动机经常用于研究个人行为的社会性 流行现象

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号