一、简介
二、关于软件定制
以前,定制一个软件的行为主要是通过子类化方法实现的。 通过这种办法,你可以改变一个窗口的外表与行为。子类化虽然被认为是一种有点暴力方式――受害者根本不知道发生的事情――但它还是长时间以来的唯一的选择。
随着微软Win32 API的到来,进程间子类化不再被鼓励使用并愈发变得困难起来。当然,如果你是勇敢的--指针从未吓倒你,而最重要的是,如果你已经游刃于系统钩子之间,你可能觉得这一问题太简单了。 但是情形并不总是这样。暂放下这点不管,问题在于每一个进程运行在自己的地址空间中,而且打破进程边界略微有些不正确性。 另一方面, 你可能需要对定制进行更好的管理。更经常情况下,定制可能是程序本身强烈要求实现的。
在后者情况下,已安装的软件只需在既定的磁盘位置查询另外的组件模块,然后装载、设定初值,最后让它们自由地按照既定的设计工作。这正是Internet Explorer浏览器和它的BHO所要实现的。
三、什么是BHO?
从某种观点看,Internet Explorer同普通的Win32程序没有什么两样。借助于BHO,你可以写一个进程内COM对象,这个对象在每次启动时都要加载。这样的对象会在与浏览器相同的上下文中运行,并能对可用的窗口和模块执行任何行动。例如,一个BHO能够探测到典型的事件,如GoBack、GoForward、DocumentComplete等;另外BHO能够存取浏览器的菜单与工具栏并能做出修改,还能够产生新窗口来显示当前网页的一些额外信息,还能够安装钩子以监控一些消息和动作。简而言之, BHO的工作如我们打入浏览器领地的一位间谍(注意这是微软允许的合法工作)。
在进一步了解BHO细节之前,有几点我需要进一步阐述。首先,BHO对象依托于浏览器主窗口。实际上,这意味着一旦一个浏览器窗口产生,一个新的BHO对象实例就要生成。任何 BHO对象与浏览器实例的生命周期是一致的。其次, BHO仅存在于Internet Explorer 4.0及以后版本中。
如果你在使用Microsoft Windows? 98, Windows 2000, Windows 95, or Windows NT版本4.0 操作系统的话,也就一块运行了活动桌面外壳4.71,BHO也被 Windows资源管理器所支持。 BHO是一个COM进程内服务,注册于注册表中某一键下。在启动时,Internet Explorer查询那个键并把该键下的所有对象预以加载。
Internet Explorer浏览器初始化这一对象并要求某一接口功能。如果发现这一接口, Internet Explorer使用其提供的方法传递 IUnknown 指针到BHO对象。见图一:

图一 ie浏览器如何装入和初始化BHO对象,BHO场所(site)是用于实现通信的COM接口
浏览器可能在注册表中发现一系列的CLSID,并由此为每个CLSID建立一个进程中实例。结果是,这些对象被装载至浏览器上下文中并运行起来,好象它们是本地组件一样。但是,由于Internet Explorer的COM特性,即使被装入到它的进程空间中于事(你的野心实现)也不一定会有多大帮助。用另一说法, BHO的确能够做许多潜在的有用的事情,如子类化组成窗口或者安装线程局部钩子,但是它确实远离浏览器的核心活动。为了钩住浏览器的事件或者自动化浏览器,BHO需要建立一个私有的基于COM的通讯通道。为此,该BHO应该实现一个称为IObjectWithSite的接口。事实上,通过接口IobjectWithSite, Internet Explorer 可以传递它的IUnknown 接口。BHO反过来能够存储该接口并进一步查询更专门的接口,如IWebBrowser2、IDispatch和IConnectionPointContainer。
另外一种分析BHO对象的途径与Internet Explorer外壳扩展有关。我们知道,一个WINDOWS外壳扩展即是一个进程内的COM服务器,它在Windows资源管理器执行某种动作时装入内存――如显示上下文菜单。通过建立一个实现几个COM接口的COM模块,你就给上下文菜单加上一些项并能预以正确处理。一个外壳扩展必须以Windows资源管理器能够发现的方法注册。一个BHO对象遵循同样的模式――唯一的改变在于要实现的接口。然而,尽管实现方式有所不同,外壳扩展与 BHO 仍有许多共同的特点。如下表一:
表一 外壳扩展与 BHO相近特性比较
| 特性 | 外壳扩展 | BHO对象 |
| 加载者 | Windows资源管理器 | Internet Explorer(和外壳4.17及以上版本的Windows资源管理器) |
| 击活动作 | 在某类文档上的用户动作(即单击右键) | 打开浏览器窗口 |
| 何时卸载 | 参考计数达到0的几秒之后 | 导致它加载的窗口关闭时 |
| 实现形式 | COM进程中DLL | COM 进程中 DLL |
| 注册需求 | 常常是为一个COM服务器设置的入口处,另加的入口依赖于外壳类型及它要应用至的文档类型 | 常常是为一个COM服务器设置的入口处,另加一个把它申请为BHO的注册入口 |
| 接口需求 | 依赖于外壳扩展的类型 | IObjectWithSite |
如果你对SHELL扩展编程有兴趣的话,可以参考MSDN有关资料。
更多内容请看浏览器安全隐患及对策专题,或进入讨论组讨论。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
·最新数据结构(试题)习题解答 (7796次浏览)
·Linux系统的硬件驱动程序编写原理 (3325次浏览)
·2000年试题集锦(下半年)数据结构试题 (3200次浏览)
·《数据结构》教学大纲--入门必看 (2867次浏览)
·Solaris 10 安装及SVC管理及X及Vmware及其 (2829次浏览)
·数据结构教程 第六课 线性表的顺 (1200次浏览)
·数据结构教程 第三十六课 选择排 (506次浏览)
·五子棋算法 (505次浏览)
·玩转你的三星--EasyStudio管理软件全攻略 (457次浏览)
·利用套接字机制实现Flash与数据库连接 (444次浏览)
·Linux系统的硬件驱动程序编写原理 (3325次浏览)
·2000年试题集锦(下半年)数据结构试题 (3200次浏览)
·《数据结构》教学大纲--入门必看 (2867次浏览)
·Solaris 10 安装及SVC管理及X及Vmware及其 (2829次浏览)
·数据结构教程 第六课 线性表的顺 (1200次浏览)
·数据结构教程 第三十六课 选择排 (506次浏览)
·五子棋算法 (505次浏览)
·玩转你的三星--EasyStudio管理软件全攻略 (457次浏览)
·利用套接字机制实现Flash与数据库连接 (444次浏览)
·新手学堂:常用的正则表达式操作符图示 10-16
·c语言数据结构教程 10-09
·教你如何分析未文档化的数据结构 10-09
·简明 Python 教程 -- 第9章 数据结构 10-09
·全文信息检索介绍及算法分析 10-09
·监听以太网(3) Packet32数据结构说明 10-09
·Discuz!6.0新版本尝鲜—“数据结构化”方便分类浏 10-09
·数据结构教程 第六课 线性表的顺序表示 10-05
·玩转你的三星--EasyStudio管理软件全攻略 10-03
·五子棋算法 10-03
·c语言数据结构教程 10-09
·教你如何分析未文档化的数据结构 10-09
·简明 Python 教程 -- 第9章 数据结构 10-09
·全文信息检索介绍及算法分析 10-09
·监听以太网(3) Packet32数据结构说明 10-09
·Discuz!6.0新版本尝鲜—“数据结构化”方便分类浏 10-09
·数据结构教程 第六课 线性表的顺序表示 10-05
·玩转你的三星--EasyStudio管理软件全攻略 10-03
·五子棋算法 10-03
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容



