com 组件必须实现的一个接口叫做 IUnknown (最小接口),
这个接口有三个方法叫做 AddRef, Release, QueryInterface
第一个方法,当生成或者拷贝一个com组件时,这个组件会调用 AddRef,使自己的引用数加一
第二个方法,反之,减一。

解决方案 »

  1.   


    如果有多个进程同时调用一个com组件,则每一个com都是一个实例。
    所以,多进程访问不用考虑的,
    要考虑的是,多线程的并发访问问题啊.
      

  2.   

    如果我用ATL编写的话,是不是就不必考虑AddRef和Release这两个方法了,ATL是不是自己就完成了这个工作!?
      

  3.   

    从一开始COM就考虑到这个问题,所以会有addref()和release()两个方法来控制引用计数从而决定com的生存期,其实应该有三层引用计数,第一层是组件级,第二层是对象级,第三层是接口级,
    接口集最为复杂,因为调用频率最高,一般com采用前两层引用计数控制只有当他们的引用计数都为0时才可以被卸载,如果是Dll则只是对一个引出函数返回值置位,告诉COM库让COM库在空闲时来完成对dll的卸载,如果是EXE只要delete this就可以了所以他没有CanUnloadNow()引出函数
      

  4.   

    to yangfanfan:我对你所说的三层引用计数不是很明白,比如我调用一个DLL,它的组件级,对象级和接口级分别对应什么引用?
      

  5.   


    多进程访问COM是个模糊的问题, COM server 是被三个进程创建的还是一个创建另外
    两个进程得到经过marshal的interface pointer, 他们是不同的。
    与COM server, client的线程模型都有关系