关于COM的进程空间模型没见到哪本书说细说,这对C++的理解要求还是有点高的,所以俺有些迷惑,对COM了解得比较好的朋友不防来指教一下,我以ATL做COM为例(一定要耐心看完啊):打开ATL,创建一个DLL式的COM工程,自定义一个接口IMyinterface,实现一些它的方法,但ATL最终实现的COM对象并不是IMyinterface,而是CoComObject类的对象,这时假设CoComObject的基类都没有数据成员,CoComObject本身只有一个LONG的引用计数器,那么 sizeof CoComObject的大小就是8,这是一个LONG变量与一个vptr的大小之和。 然后我发布了这个COM,凡调用这个COM的用户程序,都要为生成COM对象而分配8个字节的空间。现在我把这个COM升级,我给IMyinterface新加了一个数据成员 OLECHAR mm,其它照旧。再发布升级版的COM。 这时用户程序要生成COM对象就要分配10个字节了,老用户浑然不觉mm的存在,它只为COM对象预留了8个字节的空间(这在编译用户程序的时候已经成为事实了),但实际上新的COM对象却占用了10个字节,理论上应该会出现非法的写内存操作。如果我说的没错,那在升级COM的时候,就不应该新加入任何数据成员,因为这笔帐最终要算到CoComObject身上去的,可俺做COM的经验非常浅,没升过COM的级。:( 上面都是猜的。
数据成员的操作,要通过COM对象内部来完成
-------------------------------------------------------------------------------------
调用COM组件对象有进程内、进程外(在同一台机器上)和远程组件对象(不同机器上)这3种,你说只是最简单的第一种。“N个应用程序调用同一个COM的时候,它们就共享一个COM对象了.”,这个没错,对COM组件对象来说,多一个程序调用它的时候,只是在它内部IConnectionPointContainer接口中多出一个连接点对象而已。你可以参照潘爱民的《COM原理与应用》第6章,上面说得很详细。