以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  Visual C#两分钟搭建BHO IE钩子  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=86931)


--  作者:卷积内核
--  发布时间:9/28/2010 8:59:00 AM

--  Visual C#两分钟搭建BHO IE钩子
微软在1997年正式推出Browser Helper Object (BHO), 使程序员能够更好的对IE进行二次开发和操作. 在通过编写BHO程序数月后, 我希望把我的一些经验告诉才开始的同志, 避免走一些弯路.

我本人是非常喜欢C++的. 因为C++对内存直接操作的方式可以节省非常多的内存损耗, 也更快一些. 但是在开发BHO的时候, 我的确也认识到, C#明显要比C++强大很多. 例如C#提供的FOREACH 循环就可以避免FOR循环产生的溢出. 另外C#的类型转换也明显要强于C++. 毕竟BHO和C#都是出自微软一家, 理所当然, C#更适合BHO开发一些. 我的第一个BHO程序是用C++写的. 对于COM的操作,让我至少弄了几天才搞清楚他们到底想干什么. 但是我的第一个C# BHO程序只用了几分钟就搭建好了钩子. 如果你希望从事BHO开发, 而且你才开始学. 我想这篇文章对您有点帮助.

下面就让我们开始.

首先我们需要在C#中新建一个DLL工程. 因为BHO是通过让IE调用DLL来驱动的. 我用的是VC# EXPRESS. 因为这已经完全够用了. VC# PROFESSIONAL 并不需要, 而且还很浪费内存.


按此在新窗口浏览图片

当我们建立一个空工程以后, 随便添加一个文件夹叫BHO, 然后添加一个文件.

按此在新窗口浏览图片


需要我们注意的是, 我们这个文件必须被命名为IObjectWithSite.cs因为这样IE才知道这是一个BHO程序. 如果想知道更多关于IObjectWiteSite接口的内容, 请查询MSDN[URL=http://msdn2.microsoft.com/en-us/library/Aa768220.aspx] http://msdn2.microsoft.com/en-us/library/Aa768220.aspx[/URL]

在IObjectWithSite中必须有两个方法GetSite和SetSite. 我们主要是对后者进行调用.通过名字大家就可以猜到他们是干什么的.

[URL=http://msdn2.microsoft.com/en-us/library/aa768219.aspx]GetSite[/URL]:  Gets the last site set with [URL=http://msdn2.microsoft.com/en-us/library/aa768221.aspx]IObjectWithSite::SetSite[/URL]. If there is no known site, the object returns a failure code.

[URL=http://msdn2.microsoft.com/en-us/library/aa768221.aspx]SetSite[/URL]:  Provides the site's [URL=http://msdn2.microsoft.com/en-us/library/ms680509.aspx]IUnknown[/URL] pointer to the object.

请把VS STUIDO 默认的类名给去掉.因为IObjectWithSite并不是一个类, 而是一个接口.

按此在新窗口浏览图片

不要忘记添加 System.Runtime.InteropServices

按此在新窗口浏览图片

下面我们再添加剂一个叫BHO.CS的主文件.

按此在新窗口浏览图片
这个新建的类是基于 IObjectWithSite接口的. 正如同我前面讲的. 你就是通过这个接口来调用IE.

按此在新窗口浏览图片


为了使用微软的BHO库.我们必须添加下面两个库: SHDocVw and MSHTML.他们一般都在 Windows\System32 下面

SHDocVw is  Microsoft Shell Doc Object and Control Library

MSHTML is:   All interfaces for accessing the Dynamic HTML (DHTML) Object Model are based on [URL=http://msdn2.microsoft.com/en-us/library/ms221608.aspx]IDispatch[/URL] and are the basis of access to the object model that is also used by scripts. http://msdn2.microsoft.com/en-us/library/bb498651.aspx


按此在新窗口浏览图片

光using SHDocVw" 是不够的, 你需要添加

按此在新窗口浏览图片
按此在新窗口浏览图片

Add SHDocVw

按此在新窗口浏览图片
因为稍后我们需要用到MESSAGEBOX, 所以这里我也添加了一个WINDOWS FORM库


按此在新窗口浏览图片

下面添加两个变量: WebBrowser and HTMLDocument. 就如同他们的名字. 一个是IE的变量, 另外一个是IE所访问的HTML页变量.

下面在这个类中田间一个叫 OnDocumentComplete 的函数. 取其他名字也行, 没什么太大关系. 但是这里为了CODE的可用性,我们叫OnDocumentComplete. 这个函数实际上是和CDHTMLDIALOG下面的OnDocumentComplete所对应的.

CDHtmlDialog Class http://msdn2.microsoft.com/en-us/library/8bed8k60(VS.80).aspx .

OnDocumentComplete的触发是在一个HTML页被LOAD完以后. 你也可以避免用Navigate() or OnBeforeNavigate(). 他们表示在发出访问和访问之前触发.

Please refer to http://msdn2.microsoft.com/en-us/library/8k5z3ekh(VS.80).aspx to find out what you need exactly.

按此在新窗口浏览图片

在 IObjectWithSite.cs下,你需要找出IE的GUID, 这样才方便注册表的更改.

按此在新窗口浏览图片

另外你需要给自己的程序添加一个GUID. 这样IE才能在注册表中找到你的信息. 你可以使用System.Guid.NewGuid() method 来得到一个GUID. 这比C++得到GUID的方法要容易得多了.

按此在新窗口浏览图片


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
27.344ms