有时候我一直就在想,COM相关的技术我们整天都在用(不用怀疑,Windows就是COM插起来的,VB6,ASP,JScript等下面都是COM),但是很多人都觉得COM难学,我觉得是不是对COM的教学走了歪路了。C++有C++的对象模型,COM有COM的对象模型,.net 和java都有自己的对象模型(当然.net跟java的对象模型对用程序员来说是透明的,MS跟sun不需要也不想让程序员了解)。只是因为COM的对象模型的部分特征看起来跟C++的对象模型比较相似,所以大多数教材都在用C++讲述COM的原理,(《COM本质论》,《COM技术内幕》是“罪魁祸首”),原理固然挺重要,但是这样一来搞得COM的起点相对很高,一定要深入理解C++的内部机制和对象模型才可以看得懂那些书写的是什么意思,而且看懂了之后,让自己动手写个能用的COM组件,还是很多人写不出来。

我就想对COM的认识是不是也可以从感性到理性,就像我们不懂得进城线程,虚存,MMU,调度算法,一样用Windows操作系统用的也挺好。不懂得POP3,SMTP协议,整天也在网上发邮件一样,可不可以讲COM不从C++将起,用vb6,用ATL,甚至用当年的Visual J++都可以先写几个COM先用起来,或者就干脆用VB用人家写的COM,例如DX和ADO什么的。然后慢慢的理解基于COM的一些技术,例如ActiveX,DirectX,OLE等等,最后在讲COM的原理,COM的优劣,COM与C++的异同等等。我觉得不一定非得彻底了解了IClassFactory,AddRef, Release, QI,IDispatch, CoCreateInstanceEx, IMoniker,SysAllocString……才叫会COM,就像我们会j2SE, j2ee,但是不知道java的垃圾回收是不是Mark&Sweep算法,也不知道java的对象的内存布局,也不知道java的.class文件里的metadata到底是怎么描述每个class和到底如何Reflection的。