【转载】COM

    组件化程序设计思想在今天应用已经非常普及,那么关于COM都有哪些东西呢? 现在向大家介绍什么是CLASS,OBJECT,INTERFACE等COM等相关概念。
一、CLASS AND OBJECT(类和对象)
    要介绍COM,就不能不提到面向对象思想,那么让我们先来看看什么是对象吧?在日常生活中,你我都是一个个对象,有姓名,有身高、体重等外在的特征,也有各自所具备的工作技能,也需要彼此间进行语言交流,同样在开发应用和GIS中也有对象的概念存在。
    你在窗体上使用了一个控件,这个控件本身有大小、位置、颜色、名称等一系列称之为属性(Properties)的外在表示,而且也会有CLICK等称之为事件(Events)的通信动作存在。在AO的世界里,每个东西都是一个对象,有象Map、Form、Layer这些我们可以看到的对象,也有在表中产生查询结果集时的游标(Cursor)-这类不可见的对象。那么对象是如何产生的呢?哦,它是由类(CLASS)实例化产生的,许多AO类对我们来说很熟悉(象Point,Line,Polygon,Layer,Table,如果你对GIS还不是很陌生的话)。不用太多的废话,就先实际进入AO来展示下什么是类和对象吧。
    Map Class
    Properties Methods
    MapScale (1:3,800,000) AddLayer (+)
    MapUnits (6234233.32,5234234.56) ClearSelection
   (很遗憾在这里我不能用图形来表达上述概念,突然觉得有些滑稽—在写一个GIS的话题)。
    如果你用过ArcMap应用程序并且还有印象的话,你会发现这个MapScale其实就是应用程序中那个文本框的内容,而AddLayer这个方法呢好象就是那个用来增加图层的“+”的行为。
二、COM是什么?
    (关于COM实在有太多的东西,以下的内容对AO的初始开发者而言,权当是一个了解吧,现在大可不必去深究)。终于开始COM了,一个很沉重也很值得玩味的东西,我想许多AO的开发者对此都会有不同的感受。COM是Microsoft的Component Object Model缩写,它不仅定义了组件程序之间进行交互的标准,而且也提供了组件程序运行所需要的环境(COM本身要实现一个称为COM库(COM library)的API,它提供诸如客户对组件的查询,以及组件的注册/反注册等一系列服务,一般来说,COM库由操作系统加以实现,我们不必关心其实现的细节,象大家经常看到的ActiveX,DirectX,OLEDB都是基于COM技术的),主要应用于Microsoft Windows操作系统平台上。COM通常的发布形式是:以win32动态链接库(DLL)或可执行文件(EXE)的形式发布。
三、COM的目标和特性
    建立在二进制代码级上的可重用性(通过包容和聚合);
    语言无关性,只要其能生成符合COM规范即可;
    对使用COM对象的客户程序而言的进程透明性;
四、对象、类和接口
    对象是COM的基本要素之一,和C++中的对象不同的是其封装特性是真正意义上的封装,对于对象使用者(通常称为客户)而言是不可见的,此外,COM对象的可重用性表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能,而C++对象的可重用性表现在c++类的继承性。
    接口是指组件对象的接口,它是包含了一组函数的数据结构,通过这组数据结构,客户代码可以调用组件对象的功能,组件对象间的访问都是通过接口来进行的。接口设计必须满足:
        1. 必须直接或间接地从IUNKNOWN接口继承(该接口在AO中是省缺的);
        2. 接口必须有唯一的标识符号;接口不变性,一旦分配和公布了IID,接口定义的任何因素都不能改变。
    用COM开发意味着使用接口,也可以称为基于接口的设计模型。对象间的所有通信都是通过它们的接口来进行的,COM接口是抽象的,意味着相关的接口没有实现,和接口相关的代码来自于一个类实现。如何实现接口对于不同对象是不同的,因此对象只是继承接口的类型,而不是它的实现,这称为类型继承。功能用接口被抽象地构造,并且用类去真正实现。在COM中类和接口通常被当作‘做什么’和‘怎么做’,接口定义一个对象能做什么,类定义它怎么去做。
    COM类提供了一个或多个接口相关的代码,因此功能实体封装在类中。几个类可以有同样的接口,但是它们的实现可能是极不相同的。通过实现这些接口,COM实现了面向对象的多态性,COM不支持多重继承概念,然而,这不是一个缺点因为一个类可以实现多个接口。
五、COM的其它组成
    COM对象的接口可以是双接口,双接口不同于普通接口(Custom Interface)之处在于双接口是从Automation基本接口Idispatch继承的,而普通接口是从Iunknown接口直接继承来的,缺省的接口模型是双接口模型是双接口。
    1、入接口和出接口(Inbound interface,Outbound interface)
    COM调用既可以是单向的(即客户程序创建组件对象,然后客户程序调用对象所提供的功能,在适当时候再把对象释放掉),通常称为入接口。如果一个COM对象支持一个或多个主动与客户程序进行通信的接口,则这种接口称为出接口,是因为这些接口并不由对象实现,而是由客户程序实现。

    2、类型库(Type Library)
    一个类型库被作为一个接口定义语言(IDL)文件的二进制版本,是一系列COM对象和接口的集合,并被编译进一个形如OLB、DLL或OCX这样的二进制文件中。为了支持一个不依赖于开发语言工具的组件集,关于ArcObjects库所有相关的数据都被打包进esricore.olb的类型库,它就包括了一个所有coclasses的二进制描述,接口,方法和服务器类型。
    Microsoft提供了多个COM接口用于类型库,这两个接口是ITypeInfo 和ItypeLib。利用标准的COM接口,不同的开发工具和编译器能够获得由一个特定库支持的coclasses和接口有关信息。
    3、双向COM支持 是指有可能既在一种语言中使用COM对象,又可使用这种语言编写COM对象;
    4、进程内COM、本地COM和远程COM
    COM是一个客户/服务器体系,服务器(或对象)提供功能,并且客户程序使用这些功能。如果COM程序和客户程序在同一进程地址空间内,则称之为进程内COM,这通常是以DLL形式实现,而本地COM是指同一计算机上不同进程中的EXE,远程COM则是指不同计算机中的DLL或EXE。有不耐烦或现在回过头看这章而且存有疑问的人吗?讲了那么多COM AND COM,那么我在DEPHI或VB下用AO写一个DLL,这个DLL到底算什么呢?好,就让我来用C/S的概念来做一个解释。如果你是自己写的应用程序框架,那么你的应用程序就是客户端,而调用的DLL其实就是服务器了;如果你在ArcMap中,那么ArcMap应用程序其实就充当了客户端的角色发出请求,这个请求通过COM机制传递给COM服务器—那个你写的DLL来完成相应的功能,而这个服务器外部和内部就是由ESRI AO的接口及类来完成的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值