[AE] 基础知识-组件对象模型COM
目录
组件对象模型COM
基本概念
对象(Object):
系统中用来描述客观事物的一个实体,构成系统的一个基本单位。由类实例化产生
类(Class):
描述一组有相同特性(属性)和相同行为(方法)的对象。
接口(Interface):
定义了一组方法和属性的数据结构,通过这组数据结构,可以调用组件对象的功能
命名空间(Namespace):
用来组织类,通常可以把相关联的类放在一个命名空间中,进行有效的管理
组件对象模型(Component Object Model):
COM不是接口,也不是对象,它是一种二进制级别的组件通信标准。对象间的所有通信都是通过它们的接口来进行的。
COM对象:
符合COM标准的对象,COM对象是实现了很多接口的对象
多态性:
同一操作用于不同的对象,可以有不同的解释,产生不同的执行接口。一个类可以有多个接口,一个接口可以由多个类实现
ArcGIS中类的多态性:几个类使用同一个Interface,但每一个类却执行不同的方法和属性
使用接口定义类
<接口名> <变量名> = new 类();
在COM中,对对象的访问时通过接口完成的,因此不能像许多可视化控件那样,可直接通过其名称来调用属性或执行其方法。
//定义一个接口变量
IDrive pGarbage;
有了这个接口对象还不行,因为接口是定义在对象上的,应该产生一个对象,而对象又是从那里来的呢?–类。于是,实例化一个类
pGarbage = new GarbageTruck();
虽然我们实例化了一个GarbageTruck类,但是我们只得到了该类的IDrive接口,只能使用IDrive接口上的方法与属性,如果要使用别的接口,需要使用这个接口变量pGarbage查询出其他接口
查询接口(QueryInterface)
COM对象有很多接口,不同的接口管理着不同类型的方法
因此可以从一个接口转到另一个接口,称为QI
这个过程是由Idispatch接口管理的
Idrive pCar = new RaceCar();
pCar.Accelerate(); //调用该接口的方法
IRace pRace = pCar as IRace; //接口查询
//或者:IRace pRace = (IRace)pCar;
pRace.PitStop();
pCar.Accelerate();
COM总结
- COM不是接口,也不是对象
- 符合COM标准的对象称为COM对象
- COM对象必须实现lunknown接口,它是默认实现的接口,这个接口是管理COM对象声明周期的,当COM对象不使用的时候,这个接口定义的方法负责释放内存
- 每个组件都有一个独一无二的标识,这就是所谓的全球唯一标识符GUID 。这个标识符就是COM组件的身份,它是一个128bits的数字,由系统自由分配
- 一个COM对象可以有多个接口,一个接口也完全可以被多个COM对象实现,通过实现这些接口,COM实现了面向对象的多态性(几个类可以有同样的接口,
但是它们的实现可能是极不相同的) - COM对象的接口是抽象的,接口与类不同。因为接口没有任何的实现,所以不能通过自身实例化。接口由具体的类来实现,功能用接口抽象地模拟,并且用类取真正实现
- COM中的接口和类通常被当做“做什么”和“怎么做”(What,How),接口定义一个对象能做什么(但自己什么都不做),类定义它怎么去做
- COM对象的接口是不可变的。接口永远都不会版本化。一旦定义下来并发布,接口不能够改变
- DLL灾难:COM是可以被重用的,COM对象的实现过程也可以被修改升级,如果两个程序使用一个COM对象,而这个COM组件升级了的话,很可以就出现某个程序无法使用新组件的情况。
我们有时候安装了新软件后很多别的软件都无法使用,很多都是因为DLL HELL。别以为这是个小问题,这可是微软提出.NET平台的一个主要原因
转载自:https://blog.csdn.net/summer_dew/article/details/79185606