利用面向对象编程语言开发出来的类组件,相当于过程化语言开发的一个模块,而面向对象用覆盖的方式取代了传统的对模块的直接修改,解决了很多开发中的问题。然而,面向对象的类的代码只能提供源代码级的重用,不能满足跨语言、跨平台的只用要求。例如,用c++开发的类模板无法被其他语言(Delphi,visual basic和powerBuider等)使用。
一个跨语言使用的方案是,把类文件打包成动态链接库(DLL),这样其他的语言就可以调用二进制DLL中的函数。但是,这样简单打包有如下缺陷:一是必须随DLL一起把头文件提交给用户才能用DLL进行开发。二是DLL所封装得函数的修改通常会导致该DLL的客户程序重新编译。
COM(Component Object Model,组件对象模型)是microsoft提出的组件标准,在windows平台上,一个COM通常也是一个DLL动态链接库文件。与常规的DLL类不同,实现COM组件的类需要从一个抽象基类中继承而来,从而拥有一个函数地址表。这样,COM组件的应用客户就可以通过请求的方式查用函数。
实现组件抽象基类又称为接口,COM对于调用者来说,就只能看见接口。COM通过接口向外部提供服务。对于调用者来说,不需要了解组件内部的具体实现,只需要知道接口就可以了。
对于windows下游戏编程最为关系紧密的directx就是基于COM组件的技术的。有人说,要是对directx有一定了解,对于directx基本可以不专门去学。这里介绍COM为了更好的了解dircectx。
最后,通过一个简单的抽象基类的继承来重写c++类,是该c++类接近于COM组件的规范,以帮助了解COM组件的开发应用。
1 直接用c++类的函数:
下面的SimpleMath类有两个函数sum100,sum200,功能是简单的将三个数相加后返回。
新建一个目录:“F:\MathClass”,在内部新建连个文件:SimpleMath.h SimpleMath.cpp。具体代码分别如下: