什么是COM?
小编总结了关于COM术语的一些资料,供大家参考!
什么是COM术语
随着计算机网络的飞速发展,软件的应用环境变得更加广阔;与此同时,软件的设计难度也在提高。为适应这种分布式软件应用环境,组件化程序设计思想迅速地发展起来。组件化程序设计思想,即复杂的应用程序被设计成一些小的、功能单一的组件模块,这些组件模块可以运行在同一太机器上,也可以运行在不同的机器上,甚至机器的运行环境也可以不同。
为此,OMG (Object Management Group,对象管理组织)提出了CORBA (Common Object Request Breaker Architecture,公共对象请求中介体系结构),而微软提出了COM (Component Object Model,组件对象模型)标准。目前,CORBA模型主要应用于UNIX操作系统平台上,而COM主要应用于Microsoft Windows操作系统平台上。
COM的特性:语言无关性、进程透明性、可重用性。
1. 语言无关性:COM是二进制代码级的标准。COM规范的定义不依赖于任何特定的语言。不同语言开发的COM对象可以交互、共享;而面向对象编程(OOP, Object-oriented Programming)语言定义的对象,只能在同种语言中被重用。实际上,可以使用OOP编程技术来开发COM组件,这两种技术是互补的。所有编程语言中,与COM规范最贴近的要数C++,所以,要想深刻理解COM,一定要有C++编程基础。
2. 进程透明性:COM提供的服务组件对象在实现时有两种进程模型:进程内对象和进程外对象。前者通常以DLL的形式,在客户进程空间中运行;后者通常以EXE的形式,运行在同一机器的另一个进程空间中,或远程机器的一个进程空间中(此时,COM对象也可能是以DLL形式提供服务,而远程机为其创建一个代理进程)。虽然COM对象有以上几种不同的进程模型,但这些区别对于客户程序来说是透明的。客户程序只要遵照COM规范操作COM对象即可,完全不必理会COM对象的进程模型。然而,我们在开发COM组件时,还是要慎重选择进程模型的。一般来说,进程内模型效率高一点,但组件如果不稳定会危及客户进程;进程外模型稳定性好,但运行时的系统开销比较大,效率相对低一点。
3. 可重用性:COM对象的可重用性与一般的面向对象语言实现的对象的重用过程是不同的。COM对象的重用性建立在对象的行为方式上,而不是具体的实现上。COM有两种机制实现对象的重用:包容和聚合。假设A为外部对象,B为内部对象。包容方式,即A实现了B上的所有接口方法,而在实际接口方法调用时,A只是简单地调用B相应的接口方法;而聚合方式,A不实现B的接口,而是把B的接口直接暴露给客户,但A保证客户不会知道有内部对象B的存在。
COM对象与C++对象的比较:
1. COM对象对对象上的数据实现完全封装,外部如果想访问对象的数据,必须通过COM对象提供的接口方法。而C++对象的数据有可能被外部直接访问。C++语言对类的成员进行了访问控制,public成员可以在对象外部直接访问。
2. COM对象的可重用性表现在COM对象的包容和聚合,一个对象可以完全使用另一个对象的所有功能;而C++对象的可重用表现在C++类的继承,派生类可以访问其父类的非私有属性、调用非私有成员函数。虽然C++和COM的重用性机制不同,但我们可以把这两种技术有机结合起来:在源代码级使用C++的类重用性,在组件一级使用COM的重用性。
3. 多态性使得客户程序可以通过统一的方法,来处理不同的对象。C++对象通过虚函数实现多态性,而COM对象的多态性通过接口来体现。
COM对象通过CLSID(一个128位的数串,如{54BB7788-0008-7789-ABAB-112233445566},也可以称为UUID或GUID)来唯一标示。我们通过这个CLSID,就可以创建对应的COM对象(调用函数CoCreateInstance)。CLSID可以通过工具UUIDGen.exe或GUIDGen.exe来随机产生。GUID不仅可以用来标示COM对象,也可以用来标示COM对象上实现的各个接口(QueryInterface调用时需要这个接口的GUID)。