浏览器插件-- Browser Helper Object(BHO)

 

最近由于需要写一个这方面的网页过滤插件,因此可说得上是费尽了心机。参阅了很多资料,在这里感谢那些愿意把自己的心得拿出来与人分享的广大同行。
   
转载请说明来自飞天猪的博客园。另外如果发现有错误,请留言指正。谢谢。

浏览器帮助对象BHOBrowser Helper Object就是我们常说的IE插件)
     
你是否想要从你的程序中连接到那些已经被运行的Internet explorer实例并获取对Internet Explorer的全部控制?然后你可以告诉Internet Explorer到哪里去,去干什么。也许你想要处理Internet Explorer的一些事件或者是访问DHTML对象模型,你也可能需要控制任何Internet explorer 的行动。

Internet Explorer的第三个版本或者更早的版本中要控制IE, 你不得不使用一个烦琐的,困难的并且有局限性的技术--动态数据交换(DDE)。DDE的其中一个局限性就是你不能够从Internet Explorer中收到事件。作为替代,你可以收到IE的消息通知,这种机制不是很稳定。如果你能够使用COM连接到一个正在运行的Internet Explorer实例,那么你就能够控制它并从收到他发出来的消息。

为了连接到一个正在运行的Internet Explorer实例,你可以使用浏览器帮助对象BHO,这是一个DLL,每当一个新的IE的实例被创建时,IE都会加载这个DLL。因此这个DLL可以控制IE的行为并监听到所有IE正在触发的事件。

    接下来我们需要了解的是如何去创建和使用 BHO 来控制 IE ,以及如何在你的 BHO 中去处理 IE 的事件。


IE是如何启动一个BHO对象的呢?

每次,当有新的IE实例启动时,IE浏览器都会去检查注册表中的项:

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer/Browser Helper Objects

如果IE在注册表中找到了这些键,IE就会去寻找在这个键下面列出来的CLSID,如图所示

   

这些被列在Browser Helper Objects 下面的键告诉IE浏览器哪些BHO是需要被载入的。你可以通过编辑注册表手动为你的BHO创建一个CLSID的键,否则你需要为你的BHO创建一些实现注册功能的代码,来插入这些键值。

    在Browser Helper Object键下面列出的每一个CLSID,IE都会在相同的进程空间比如浏览器中,调用CoCreateInstance 来启动一个新的BHO实例。换句话说,IE把BHO作为一个进程中的服务启动了。如果这个BHO已经注册了自己的CLSID并且实现了 IObjectwithSite接口,那么这个被IE启动的BHO就把传递了一个指针给IE浏览器的IWebBrowser2接口。通过这个接口,BHO 可以控制并收到来自IE浏览器的事件。

    只要BHO被正确的创建了,那么每当新的IE的实例被启动的时候,他就会被IE加载。因此如果你安装了Microsoft Active Desktop,那么每次当你打开一个文件夹,一个子文件夹、或者一个浏览器窗口时,BHO都会被加载。如果你不再想要BHO被加载,你必须删除跟这个 BHO相关联的注册表项。另外,你可以手动的编辑注册表项来删除它,也可以在你的BHO中写一些卸载的代码来为你做这些工作。


你可能感兴趣的:(【,ASP.NET,】)