
图一 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有关资料。
四、BHO的生存周期
前面已经说过,BHO不仅仅为Internet Explorer所支持。如果你在使用外壳 4.71或者更高版本,你的BHO对象也会被Windows资源管理器所加载。下表二展示了我们可以使用的不同版本的外壳产品情况,Windows外壳版本号存于库文件shell32.dll中。
表二 不同版本的Windows外壳对于BHO的支持情况
外壳版本
安装的产品
BHO的支持情况
4.00
Windows 95,Windows NT 4.0 带或不带 Internet Explorer
4.0 或更老版本。 注意没有安装外壳更新
Internet Explorer 4.0
4.71
Windows 95,Windows NT 4.0 带Internet Explorer 4.0
和活动桌面外壳更新
Internet Explorer 与Windows 资源管理器
4.72
Windows 98
Internet Explorer与Windows 资源管理器
5.00
Windows 2000
Internet Explorer与Windows 资源管理器
本文章更多内容:<<上一页 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 下一页>> |