能够产生新窗口来显示当前网页的一些额外信息,还能够安装钩子以监控一些消息和动作。简而言之,BHO的工作如我们打入浏览器领地的一位间谍(注意这是微软允许的合法工作)。
f在进一步了解BHO细节之前,有几点我需要进一步阐述。首先,BHO对象依托于浏览器主窗口。实际上,这意味着一旦一个浏览器窗口产生,一个新的BHO对象实例就要生成。任何BHO对象与浏览器实例的生命周期是一致的。其次,BHO仅存在于I
ter
etExplorer40及以后版本中。如果你在使用MicrosoftWi
dows98,Wi
dows2000,Wi
dows95,orWi
dowsNT版本40操作系统的话,也就一块运行了活动桌面外壳471,BHO也被Wi
dows资源管理器所支持。BHO是一个COM进程内服务,注册于注册表中某一键下。在启动时,I
ter
etExplorer查询那个键并把该键下的所有对象预以加载。I
ter
etExplorer浏览器初始化这一对象并要求某一接口功能。如果发现这一接口,I
ter
etExplorer使用其提供的方法传递IU
k
ow
指针到BHO对象。见图一:
图一ie浏览器如何装入和初始化BHO对象,BHO场所(site)是用于实现通信的COM接口浏览器可能在注册表中发现一系列的CLSID,并由此为每个CLSID建立一个进程中实例。结果是,这些对象被装载至浏览器上下文中并运行起来,好象它们是本地组件一样。但是,由于I
ter
etExplorer的COM特性,即使被装入到它的进程空间中于事(你的野心实现)也不一定会有多大帮助。用另一说法,BHO的确能够做许多潜在的有用的事情,如子类化组成窗口或者安装线程局部钩子,但是它确实远离浏览器的核心活动。为了钩住浏览器的事件或者自动化浏览器,BHO需要建立一个私有的基于COM的通讯通道。为此,该BHO应该实现一个称为IObjectWithSite的接口。事实上,通过接口IobjectWithSite,I
ter
etExplorer可以传递它的IU
k
ow
接口。BHO反过来能够存储该接口并进一步查询更专门的接口,如IWebBrowser2、IDispatch和ICo
ectio
Poi
tCo
tai
er。另外一种分析BHO对象的途径与I
ter
etExplorer外壳扩展有关。我们知道,一个WINDOWS外壳扩展即是一个进程内的COM服务器,它在Wi
dows资源管理器执行某种动作时装入内存——如显示上下文菜单。通过建立一个实现几个COM接口的COM模块,你就给上下文菜单加上一些项并能预以正确处理。一个外壳扩展必须以Wi
dows资源管理器能够发现的方法注册。一个BHO对象遵循同样的模式——唯一的改变在于要实现的接口。然而,尽管实现方式有所不同,外壳扩展与BHO仍有许多共同的特点。如下表一:表一外壳扩展与BHO相近特性比较特性r