BHO简介:
    BHO就是Browser Helper Object. 意思就是IE的插件..
    这里有一篇介绍. http://www.microsoft.com/mind/0598/browhelp.asp
    BHO关联原理 (BHO关联的是SHDOCVW,也就是说不只关联IE,下面全部用IE来说明)
    1.IE的窗口打开时,先寻找SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\ 这里的对应的是CLSID
    2.IE根据CLSID创建 BHO 对象,并且查找 IOleObjectWithSite 接口. (这个接口非常简单,只有SetSite和GetSite两个方法)
    3.IE把IWebBrowser2传到 BHO 的 SetSite 方法
    4.窗口关闭时,IE把 null 传到 BHO 的 SetSite 方法.
 
    也就是说,如果你要做一个BHO,那么要做以下几个步骤
    1.创建 COM 类型, 实现 IOleObjectWithSite
    2.在 SetSite 的时候, 得到IWebBrowser2 , 并且进行自定义的初始化 . (一般是关联IWebBrowser2的事件)
    3.注册COM类型,并且关联到SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\
 
OK , 下面来说说如何用 DotNet 做到这点 . 我这里有一个例子程序,是用 VS.NET2003 写的. 里面有一个 _steps.txt 解析了具体的过程.
 
 
要测试这个例子,你只需要编译这个工程,然后执行NetBHO.reg . 再重新打开IE就OK了.
 
_steps.txt 的内容为
 
重要的步骤是:
.引用 Interop.SHDocVw . 这个引用有点麻烦,因为要注册到COM,所以NetBHO必须是强名的。所以必须要用ildasm/ilasm对SHDocVw重新进行编译和引用。
.定义 IOleObjectWithSite . 代码在 oledef.cs 里. 这个定义是根据 DotNet COM Interop 的原则, 在我VC6的Include找到的IOleObjectWithSite的定义的基础上进行的.
.定义 class MyBHO : IObjectWithSite , 并且实现它. 这个相对还是容易了..

例子的实现是关联了一个 BeforeNavigate2事件 , 如果 url 是 ?keyword 或 http:///?keyword , 那么就转到 http://www.google.com/search?q=keyword 去.
也就是说,如果你在地址栏里输入 ?helloworld , 那么就会用 google 来查 helloworld

另外例子还关联了 NavigateComplete2事件, 并且在页面上插入了一条广告 ....

Regards ,Lostinet.