组件复习资料(com)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

接口的定义及作用接口是有序排列的一组函数指针,可以简单理解为一组函数,每一个接口相当于该组件对外的一个窗口,客户可以从不同的视角(接口)看到,获得该组件通过该接口提供的服务(集)COM接口有哪些规定,规定的目的对接口进行规定,是为了达到COM组件标准提出的目标。COM接口的三个规定:1)IUknown:所有组件都有一个称为IUknown的接口(未名接口),该接口中依次给出的三个函数是:QueryInterface,AddRef,Release。一个组件可以同时被多个客户所使用,使用时需要载入到内存中。为知道何时这个组件没有客户,可以利用一个计数器来记录该组的使用情况。2)其他接口:一个组件的其他接口可以看作IUknown接口的子接口,即其它任何一个接口的前三个函数与IUknown接口中的三个函数相同。客户获得一个接口后,可以查询其它接口是否存在。每个接口能够进行引用计数。3)不变性:一旦公开了某一个接口,该接口将永远不能发生改变。包括函数在接口中的顺序。改变接口部分的唯一方式是:为组件增加新的接口。目的是兼容。版本升级不影响老客户。每一个接口有唯一的接口标识(ID)。当用新版本的组件替换旧版本的组件会对原来的部分产生影响吗?版本升级不影响。当组件发布了一个接口并被某个客户使用之后,该接口绝对不会发生任何改变,而将永远保持不变。新接口可以继承老接口,也可以完全不同。使用新接口还是老接口由用户自己决定。这种处理多个版本的方法最有效的地方在于它是无缝的。一个接口有唯一的接口表示(ID),一个组件也有唯一的一个标识,客户不需要任何工作既可以确定他所使用的接口是正确版本。接口的标识是同其版本完全绑定在一起的。新版本的组件要求保持向后的兼容或许是不可能的,但是COM处理多个版本的手段在保持后向兼容不可能的情况下同样是有效的。因为接口ID决定了它的版本,当客户获取某个接口时,由于不同版本的接口实际上是不同的接口,它们有各自不同的ID,因此客户仍能够正确获取正确版本。COM组件与面向对象程序中的模块有什么区别?软件模块是应用程序为实现某一特定的任务和要求,而对这些要求的实现以模块化的形式在主程序之外单独进行实现。这种定义必须依赖于某一特定的主程序才能进行调用,其编译后生成的类文件也必须和主程序在同一目录下。组件是一个单独的,能够实现一个或多个任务的对象,它与平台和编译语言无关,组件具有统一的定义和标准,通过接口与调用它的应用程序进行交互,可以在多种不同的系统平台和应用程序中被重复的调用。对其功能进行扩张时,只需要增加新的接口或对接口的功能进行新的定义即可。可复用性强,独立性强。IUnknown接口中的三个函数的作用QueryInterface,AddRef,ReleaseQueryInterface的作用是对组件的接口进行查询,即:组件客户可以通过它查询该组件是否存在某一个接口(某一组功能)。若存在某个接口,客户可以获得该接口,从而获得该接口中提供的服务。AddRef和Release通过计数器共同完成引用计数功能。组件中,提供类厂(IClassFactory)接口的作用CoCreateInstance函数是创建组件的时候使用最多的一种方法,但是它的灵活性不能够满足所有组件的需求,它没有给客户提供一种能够控制组件创建过程的方法,在建立好一个组件之后,无法控制将组件装载或检查客户是否具有权限。因此需要引入类工厂以获得更高的灵活性。CoCreatInstance实际上并没有直接创建组件,用CoCreateInstance创建的组件实际上是通过IClassFactory创建的,类厂唯一的功能就是创建其他组件。客户可以通过类厂所支持的接口来对类厂创建组件的过程加以控制。创建组件的标准接口就是IClassFactory。用什么方法来区分两个组件对于客户来说,一个组件就是一个接口集。用户只能通过接口才能与COM组件打交道。因此如果能够判断两个接口是否是同一个组件中的接口将可以区分是否是同一组件。组件的实例只有一个IUknown接口。因为当查询组件实例的IUknown接口时,不论通过哪一个接口,所得到的都将是同一个指针。为了确定两个接口是不是指向同一个组件,可以通过这两个接口查询IUknown接口,然后将返回值进行比较,如果相同则说明两个组件是同一个组件,不同则说明不是同一个组件。编写COM组件的步骤具体步骤:1)首先从COM库中找出CLSID相应的类厂CoGetClassObject,客户通过调用CoGetClassObject来启动组件的创建过程。2)COM库实现了CoGetClassObject函数,此函数查找指定组件,找到后装载实现此组件的DLL。3)接着DLL实现了被CoGetClassObject调用的DLLGetClassObject函数,在DLLGetClassObject中创建类厂IClassFactory。4)在CoGetClassObject中返回IClassFactory,产生pIClassFactory5)pIClassFactory调用IClassFactory::CreateInstance,从而创建IClassFactory。6)IClassFactory创建组件IX7)IClassFactory返回IX给客户,得到pIX8)pIX调用IX:Fx,得到IX文字描述:1)定义接口,在接口中声明组件中需要使用的方法和变量,声明方法使用虚函数声明,定义的接口都要继承IUknown。2)定义实现接口方法的抽象类。实例化类之后,才会对已经实例化的类对象分配内存空间。对类中接口的引用,可以通过对象指向接口的指针来调用。3)定义指向是实例化类对象的指针,并可以向调用它的接口返回标识,生成模块,定义文件,并在客户可以获取某个组件接口之前,将DLL装载到过程空间中并创建此组件。4)创建类厂。在类厂中使用CreateInstance方法连接到动态链接库接口,并用指针指向这个接口。用DLLGetClassObject函数创建类厂,并根据类厂的接口标识返回类厂指针。5)实例化类厂。使用CoCreateInstance实例化类厂,即生成一个实例类厂的对象,这个对象是可以被用户调用的。

1 / 3
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功