一个COM对象是允许多处引用的,因此不允许直接终止,以免影响其它的引用.为此,COM提出了引用计数的方法,每一个引用者将它的引用计数加一,用完后减一,当所有的引用者都不在使用它时,引用计数被减到0,对象就会被释放.
在Delphi中,引用计数是自动维护的.当你把一个COM对象(接口)赋值给另一个变量时,引用计数自动加一;当你对一相接口类型变量赋值时,如果该变量原值不是NIL,原值的引用计数自动减一.
如果一定要终上一个COM对象,可以这样做(当心,危险!):i := aobj._AddRef;
while i > 1 do
  i := aobj._Release;
aobj := nil;
上面的代码是先调用了_AddRef,,判断条件是i>1,都是考虑到Delphi对引用计数的自动维护,以免导致对象被终止后Delphi又去把它的引用计数减一而产生内存访问异常.如果是在C++中就可以这样写:
while (aobj->Release());
就行了.

解决方案 »

  1.   

    com对象在超出作用范围是会自动释放的。
      

  2.   

    对接口和调度接口,只要把对象变量赋值 nil 就可以了,对于OleVariant类型的,那么赋值 Unassigned就OK了。
      

  3.   

    重新启动一定可以。(hehe....我不会。)
      

  4.   

    只记得在启动COM的时候有两种方式,一种是调用完毕后驻留在内存等另外的模块调用,另一种是在调用完毕以后直接释放!
    帮你UP一下吧!
      

  5.   

    我决定使用事件Sink来解决谢谢大家对一个荒谬的问题的回答!多谢,我现在的心情也好多了