如许的代码再熟习不外了,在当地历程中运转是不会有成绩的。可是你想一想,假如这个对象是在“地球另外一边”的盘算机上,了局会怎样?嘿嘿,C++在计划new的时分,可没有思索远程的完成呀(盘算机言语固然不会,也没需要往计划)。因而启动组件、挪用接口的功效,固然就由COM体系来完成了。
<br>
图一 组件挪用机制
由上图能够看出,当挪用组件的时分,实际上是依托代办署理(运转在当地)和存根(运转在远端)之间的通信完成的。详细来讲,当客户程序经由过程CoCreateInstance()函数启动组件,则代办署理接受该挪用,它和存根通信,存根则它地点的当地(相对客户程序来讲就是远程了)实行new操纵加载对象。关于初学者,你能够不必理它,代办署理和存根对我们来讲是通明的。只需约莫晓得是怎样一回事就统统OK了。
成绩又来了,这个远程的对象甚么时分没落呢?在第二回先容接口观点的时分,事先我们特地疏忽了两个函数,就是IUnknown::AddRef()和IUnknown::Release(),从函数名就可以猜到了,一个是对外部援用记数器(Ref)加1,一个是开释(减1),当记数器减为0的时分,就是开释的时机啦。看起来很庞大,没举措,由于这是在先容道理。实在在我们写程序的时分到对照复杂,请人人恪守几个准绳:
1、启动组件失掉一个接口指针(Interface)后,不要挪用AddRef()。由于体系晓得你失掉了一个指针,以是它已帮你挪用了AddRef()函数;
2、经由过程QueryInterface()失掉另外一个接口指针后,不要挪用AddRef()。由于......和下面的事理一样;
3、当你把接口指针赋值给(保留到)另外一个变量中的时分,请挪用AddRef();
4、当不必要再利用接口指针的时分,务必实行Release()开释;
5、当利用智能指针的时分,能够省略指针的保护事情;(注1)