COM,组件对象模型,通俗说就是COM就是提供了一种编程的架构。通过COM规范规定了COM组件应该实现的一些接口和接口函数,其他程序通过固定的方法使用这些函数,在Windows平台下,所谓的固定方法通过提供的各种GUID在注册表中找到COM组件,然后调用指定的DLL或者EXE(通过ROT)调用指定的函数,以获得所需要的接口的指针,所谓的接口的指针其实就是指向函数指针数组的指针,通过接口指针调用COM组件提供的服务。
如果不借助ATL等类库等实现COM组件,其实也很简单,只需要牢记下面几点就可以了:
1、使用IDL在idl文件中定义接口。因为COM是与语言无关的,所以需要一种各种语言等能懂的语言来定义
接口。使用MIDL编译编写好的idl文件可以获得一个.h文件,从此文件中就可以看出在idl文件中定义的
接口被编译成了C++中的纯虚类。从这里也可以得到:
A、纯虚类的内存结构确实是和COM所要求的内存结构相同,所以使用纯虚类来定义COM接口;
B、其实可以不需要idl文件直接使用C++语言定义COM接口,那又为什么需要呢?简单言之,就是为了
实现COM的语言无关性。使用C++定义的接口不能被其他语言所使用,当使用IDL语言编写的idl文件
被MIDL编译之后可以生成一个.tlb的类型库文件,此文件可以被其他语言使用。
2、接口的实现其实很简单,就是在继承了所定义的接口的派生类当中实现就可以了。一个派生类可以继承自多个接口。为了实现一些功能可以继承自一些标准的COM接口,比如:IDispatch、IMarshl等,但是一般都需要实现IClassFactory或者IClassFactory2接口。类厂接口的作用是提供一个通用的创建组件对象的
方法。对于进程内组件在C++中我们可以使用new来创建新的对象,但是对于进程外或者是远程的组件,new 好像是无能为力了,所以提供类厂接口,由类厂和代理打交道来完成对象的创建。
3、组件程序中实现相关的导出函数,以便被其他应用程序调用,比如注册函数、生命周期控制函数等等。
4、最后要牢记如果要有不清楚的地方多看MSDN,熟记一些常用的标准接口,对于套间、列集等要特别注意。
无论是在MFC中使用嵌套类来实现COM,还是ATL中使用的多重继承来实现COM,抑或是使用ODL语言来编写接口的定义,其最基本都是上面所说的,只不过MFC和ATL中多了一些宏来替代直接使用C++编写的各种类定义、函数定义等,这样使程序看起来简洁,但是对于认识COM的原理其实并没有好处,所以在使用这些宏的时候看看它们的定义会帮助你更深刻的认识COM。ODL语言只是IDL语言的扩充,其实没有什么特别的地方,只要多看看,弄懂了一些关键字的意思就可以了,比如:interface、dispinterface、coclass、import、library、importlib、defult等等。
总之要想深刻的认识COM,熟练的使用COM编程,就要如Don所说,多动手编程,多使用它们,并考虑它们是如何的工作起来的。