-- 作者:卷积内核
-- 发布时间: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的方法要容易得多了. 
|