AO编程中需用到的COM知识(转)

转自http://www.cnblogs.com/vakinglee/articles/453188.html 谢谢!


1. COM不是接口,也不是对象,它是一种标准。
2. 符合COM标准的对象就是我们要谈论的重点——COM对象。其实COM对象也无非是实现了很多接口的对象而已。
3. COM对象必须实现Iunknown接口,这个接口是管理COM对象生命周期的,当COM对象不使用的时候,是这个接口定义的方法负责释放内存。一个COM对象可以没有任何别的接口,但是这个必须要,它是默认实现的接口。
4. QI,即所谓查询接口。由于COM对象有很多个接口,不同的接口管理着COM的不同类型的方法,因此从一个接口可以使用的方法转到另一个接口可以使用的方法的过程称为QI,这个过程是由Idispatch接口管理的。
5. GUIDs 每个组件都有一个独一无二的标识,这就是所谓的广泛唯一标识符。这个标识符就是COM组件的身份,它是一个128bits的数字,由系统自由分配,不要担心这个标识会有重复的一天。如果我们每秒产生1000万个UID,那么到5770年才可能遇到重复。别告诉我那个时候我们还使用WINDOWS的玩意。
6. 一个COM对象可以有多个接口,一个接口也完全可以被多个COM对象实现。
7. 接口分为两种,内置接口和外置接口。前一种定义的是COM对象的方法和属性,用implements实现,COM对象必须实现所有的接口内容;后一种定义的是COM对象的事件,用withEvents实现,这种接口在实现的时候不必实现所有的内容。
8. COM组件必须被注册后才能使用,它得到注册表那里去登记“户口”。
9.COM对象的接口可以是双接口,双接口不同于普通接口(Custom Interface)之处在于双接口是从Automation基本接口Idispatch继承的,而普通接口是从Iunknown接口直接继承来的,缺省的接口模型是双接口模型是双接口。
10. 一个类型库被作为一个接口定义语言(IDL)文件的二进制版本,是一系列COM对象和接口的集合,并被编译进一个形如OLB、D LL或OCX这样的二进制文件中。为了支持一个不依赖于开发语言工具的组件集,关于ArcObjects库所有相关的数据都被打 包进esricore.olb的类型库,它就包括了一个所有coclasses的二进制描述,接口,方法和服务器类型。
11.进程内COM、本地COM和远程COM
COM 是一个客户/服务器体系,服务器(或对象)提供功能,并且客户程序使用这些功能。如果COM程序和客户程序在同一进程地址 空间内,则称之为进程内COM,这通常是以DLL形式实现,而本地COM是指同一计算机上不同进程中的EXE,远程COM则是指 不同计算机中的DLL或EXE。例:就让我来用C/S的概念来做一个解释。如果你是自己写的应用程序框架,那么你的应用程序就是客户端,而调用的DLL其 实就是服务器了;如果你在ArcMap中,那么Ar cMap应用程序其实就充当了客户端的角色发出请求,这个请求通过COM机制传递给COM服务器—那个你写的DLL来完成相应的 功能,而这个服务器外部和内部就是由ESRI AO的接口及类来完成的。


COM组件很不错,可是它也有致命的缺陷,这个缺陷就来自它本身。我们知道,COM是可以被重用的,COM对象的实现过程也可以被修改升级(定义是不能修改的哦),如果两个程序都使用一个COM对象,而这个COM组件升级了的话,很可能就出现某个程序无法使用新组件的情况,这就被称为“DLL HELL(DLL灾难)”,我们有时候安装了新软件后很多别的软件都无法使用,很多原因就是因为这个DLL HELL。别以为这是个小问题,这可是人家微软提出.NET平台的一个主要原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值