浅析浏览器插件技术---c#篇

    关于软件设计人员开发浏览器插件技术都是保密的,这类的计算机学术内容是很少的,早期的程序员都是自己摸索,要走许多弯路。

   从当今浏览器插件开发来看,谷歌浏览器走在前沿,谷歌内部开发者善于使用JavaScript语言丰富其浏览器插件内容。谷歌开发者文档也是开源的。

   这里谈谈微软公司如何开发浏览器插件,不过遗憾的是微软官方网站已经不能访问,编程语言是c#,当然也可以使用c+,最好vc+。

C#明显要比C++强大很多. 例如C#提供的FOREACH 循环就可以避免FOR循环产生的溢出. 另外C#的类型转换也明显要强于C++. 毕竟BHO和C#都是出自微软一家, 理所当然, C#更适合BHO开发一些.

   用C#搭建 BHO勾子,BHO''''即英文''Browser Helper Object 的缩写'',通过它,扩展插件。''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

   now,我们需要在C#中新建一个DLL工程. 因为BHO是通过让IE调用DLL来驱动的. 我用的是V C# EXPRESS. 因为这已经完全够用了. 集成开发环境visual studio 2010,图

浅析浏览器插件技术---c#篇_第1张图片

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

浅析浏览器插件技术---c#篇_第2张图片
 


需要我们注意的是, 我们这个文件必须被命名为IObjectWithSite.cs因为这样IE才知道这是一个BHO程序. 如果想知道更多关于IObjectWiteSite接口的内容, 请查询MSDN 

http://msdn2.microsoft.com/en-us/library/Aa768220.aspx

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

GetSite:  Gets the last site set with IObjectWithSite::SetSite. If there is no known site, the object returns a failure code.

SetSite:  Provides the site's IUnknown pointer to the object.

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

浅析浏览器插件技术---c#篇_第3张图片

记得添加 System.Runtime.InteropServices

浅析浏览器插件技术---c#篇_第4张图片

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

浅析浏览器插件技术---c#篇_第5张图片

浅析浏览器插件技术---c#篇_第6张图片

   

为了使用微软的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 IDispatch 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

浅析浏览器插件技术---c#篇_第7张图片

Add SHDocVw

浅析浏览器插件技术---c#篇_第8张图片

因为稍后我们需要用到MESSAGEBOX, 所以这里我也添加了一个WINDOWS FORM库.

浅析浏览器插件技术---c#篇_第9张图片


下面添加两个变量: 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.代码如下:

浅析浏览器插件技术---c#篇_第10张图片

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

浅析浏览器插件技术---c#篇_第11张图片

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

我们必须给 SetSite and GetSite 加上内容. 在SETSITE中我们就需要加入一个EVENTHANDLER, 让IE来触发我们的OnDocumentComplete函数.

浅析浏览器插件技术---c#篇_第12张图片

浅析浏览器插件技术---c#篇_第13张图片

最后编译, 我们就有了我们的DLL,

浅析浏览器插件技术---c#篇_第14张图片

OK,成功,

打开注册表, 找到Browser Helper Object under LOCAL_MACHINE->SOFTWARE->MICROSOFT->WINDOWS->EXPLORER, 看看是不是有变化了?

浅析浏览器插件技术---c#篇_第15张图片


我们注册完了, 下面就是来写我们的住程序来控制IE了. 下面就是一个例子来抓去你正访问的页面上的所有INPUT 元素的NAME.

在DOCUMENT中, 我们的所有元素都为IHTMLElement, 我们需要调用的是IHTMLInputElement. 所以我们通过GetElementByTagName的方法来查找所有的INPUT ELEMENT. 在找到以后还需要进行类型转换才能找到对应的ATTRIBUTE. 否则IHTMLElement是不代有NAME ATTRIBUTE的. IHTMLElement提供的ATTRIBUTE都是所有元素都有的. 例如ID, 例如TITLE, 例如OnClick等. 有的元素有自己特有的ATTRIBUTE, 例如INPUT有OnFocus这就必须要转换成IHTMLInputElement才能上使用. INPUT对应的IHTMLInputElement, Select-> IHTMLSelectElement .......

浅析浏览器插件技术---c#篇_第16张图片

下面我们试另外一个方法叫 BeforeNavigate() .它的触发是在你开始下一个页面之前. 也就是说例如你要提交一个表单, 页面要变化了, 他就被触发.实际上MS提供了两个类似的接口 BeforeNavigate and BeforeNavigate2(). 

浅析浏览器插件技术---c#篇_第17张图片

浅析浏览器插件技术---c#篇_第18张图片

浏览器插件开发完成。

end

你可能感兴趣的:(浅析浏览器插件技术---c#篇)