Com组件开发用于浏览器插件


   在 IE的世界中,插件存在的方式有两个种;

  (1)、activeX 插件

   (2)、COM插件,也就是BHO插件

com为组件之间提供了交互的规范,也实现了提供交互的环境,因为组件之间交互的规范不涉及任何的语言,所以Com是为不同语言之间协作开发的一种标准

OLE技术以COM技术为基础

     COM规范包括规范和实现两大部分,规范部分定义了组件与组件之间通信的机制,这些规范不依赖于任何特定的语言和操作系统,只要按照规范,任何语言都可以使用COM标准的实现部分是COm 库,com库为COm标准的具体实现提供了一些核心

    接口是一组逻辑上相互关联的函数集合,其函数称为接口成员函数,对象通过接口成员函数为客户提供服务

   在COM模型中,对象对于客户来说是不可见得,客户通过接口来请求相应的服务,每个接口通过一个唯一的128位GUID标示符来标识,客户通过guid获得接口的指针,再通过接口指针,客户端就可以调用相应的成员函数

  一般来说,接口是不变的,只要客户期望的接口在组件对象中还存在就可以继续使用,对象可以支持多个接口,因此组件对象的升级可以通过增加接口的办法来实现,这样新接口可以不影响原来接口的调用

  COM定义了一组完整的接口规范,不仅可以弥补dll作为接口API的不足,还充分发挥了组件对象的优势,实现了组件对象的多态性


   接口定义和标识

    从技术上讲,接口是包含一组函数的数据结构,通过这组数据结构,客户端代码可以调用 组件对象的功能,接口定义了一组成员函数,这组成员函数暴露出组件的全部信息,客户程序利用这些函数提供组件对象的服务

    客户端通过指向一个接口数据结构的指针来调用接口函数,接口指针实际上又指向另一个指针,这两个指针指向同一组函数,称为接口函数表(VTable),接口函数表中每一项为4个字节的函数指针,每个函数指针与对象的实现连接起来,通过这种方式,客户只要获得对象的接口指针,就可以调用对象的实际功能

  对于一个接口来说,他的虚函数表是确定的,因此接口的成员函数是不变的,而且成员函数的先后顺序也是不变的,对于每个成员函数来说,接口的参数和返回值也是不变的


  接口描述语言 IDL(Interface Descript language)

  接口描述语言是描述接口的语言

 interface  IUnKown

 {

   HRESULT   QueryInterface([in] REFIDD uuid, [out]void ** pVtable);

  LONG  AddRef(void);

  LONG  Release(void);

}


ClassFactory 与 DllGetObjectClass

类工厂是COM组件对象的生产基地,COM类库通过类工厂来创建COM对象,每一个COM类,都有一类工厂用于创建COM对象,类工厂本身也是一个COM对象,他支持一个特殊的接口 IClassFactory

其定义如下;

class IClassFactory::public IUnknown

{

vritual HRESULT _stdcall  CreateInstance(IUnknown *pUnknown, const IID &iid, void **ppv) = 0;

virtual HRESULT _stdcall lockserver(BOOL  block) = 0;

};

接口IClassFactory 有一个重要的成员函数CreateInstance,用于创建对应的COM对象,因为每一个类工厂只针对一个特定的COM对象,所以Createinstance知道创建什么样的COM对象,在CreateInstance接口函数中,第一个参数punknown用于对象被聚合的情形,没有聚合则设置为NULL,另一个成员函数lockServer用于控制组件的生存周期

 因为类工厂本身也是个COM 对象,它被用于其他对象的创建过程,那么类工厂对象是由谁来创建呢,答案是额DLLGetObjectClass导出函数, DLLGetClassObject并不是COM库的函数,而是由组件程序实现的导出函数,

 COM库接收到创建对象的指令后,调用进程内的组件函数DllGetClassObject,由该函数创建类工厂对象,并返回类工厂对象的接口指针,客户端获得类工厂对象的接口指针,就可以通过类工厂接口指针调用CreateInstance函数创建相应的COM对象,并返回COM对象的初始对象指针,COM类库与类工厂也通过此函数进行交互


了解了COM 对象的相关知识,现在可以通过BHO来定制浏览器的接口

BHO(Browser Helper Object)是实现特定接口的COM组件,开发好的BHO插件在注册表的特定位置注册之后,每当IE浏览器启动之后,BHO实例就会被创建,在浏览器的工作的进程中,BHO会接收到很多响应的事件,比如浏览器浏览新的地址、前进、后退,跳转到新的页面,生成新的窗口,浏览器退出等等,BHOI可以与这些事件的响应中实现与浏览器的交互

  BHO的工作原理: BHO是实现特定接口的COM组件,而且一定是想了IObjectWithSite接口,这些组件除了在注册表中注册为COM Server外,还必须在将他们的CLSID在LK\\SOFTWARE\Microsoft\Windows\ CurrentVersion\Explorer\Browser Helper Objects下注册为子键,MS在设计浏览器的时候已经为这些组件预留了空间,每当浏览器启动的时候,浏览器首先在上述注册表的位置查找是否有注册的BHO CLSID ,如果有则分别创建实例,并对实例进行初始化,建立交互的连接(PS:BHO实例只有在创建它的浏览器窗口销毁时才被释放)

  成功的创建BHO,不仅可以响应各种标准的浏览器操作事件,并作出响应,还可以定制浏览器的菜单、工具栏、状态条等界面元素,还可以安装钩子函数,监视浏览器的一举一动,支持BHO插件的浏览器的版本在4.0以上,如果是文本浏览器,操作系统要求 winNT 以及 Shell版本4.0以上

  





 



 




你可能感兴趣的:(数据结构,浏览器,Microsoft,语言,browser,interface)