关于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的级。:( 上面都是猜的。

解决方案 »

  1.   

    应该不会,你仅仅能获得一个由COM 对象 new 出来COM指针而已
    数据成员的操作,要通过COM对象内部来完成
      

  2.   

    也不全是,rpcrt4.dll 会参与 COM 对象访问管理,对开发者而言只能见到COM指针
      

  3.   

    我觉得所谓的"COM对象"应该是创建在调用者进程的空间中,不然N个应用程序调用同一个COM的时候,它们就共享一个COM对象了.
      

  4.   

    我觉得所谓的"COM对象"应该是创建在调用者进程的空间中,不然N个应用程序调用同一个COM的时候,它们就共享一个COM对象了.
    -------------------------------------------------------------------------------------
    调用COM组件对象有进程内、进程外(在同一台机器上)和远程组件对象(不同机器上)这3种,你说只是最简单的第一种。“N个应用程序调用同一个COM的时候,它们就共享一个COM对象了.”,这个没错,对COM组件对象来说,多一个程序调用它的时候,只是在它内部IConnectionPointContainer接口中多出一个连接点对象而已。你可以参照潘爱民的《COM原理与应用》第6章,上面说得很详细。
      

  5.   

    你提到的问题一楼朋友已经说了,接口只是COM中专用名词,其实本质上还是类,你可以在对类升级时随意添加数据成员(属性)或函数成员(方法),这会增加接口对象字节的大小。不过,我们在用的时候,是通过类厂创建COM对象后传过来的该对象的指针(32位系统上固定只有4个字节大小)来实现组件提供的功能,不用考虑对象本身实际占用多少个字节。
      

  6.   

    要学习COM,需要对C++的类继承机制和重载机制有相当的了解。其实看了设计模式,就知道COM也不过如此。
      

  7.   

    MackZ出关了?最近不常见你其实C++相关的经典书籍也看了不少了,以COM而言,ATL指南,COM本质论,COM原理与应用都在案头,就是感觉疑惑一来,去找书上说的越看越糊涂.以这个进程空间问题为例:Don Box在COM本质论的第一章讲DLL升级的时候,旧的DLL中加入一个int数据之后,老的用户程序就会崩溃. 但你们都说传递的只是一个指针,可以新增数据成员.我本人没有太多经验,做什么也差不多都是纸上谈兵,所以就更加不知道谁说的对了