COMではまず、クラスをCreateInstanceして、QueryInterfaceして、ほっとけば呼び出し側の参照が切れたときに消える。
CreateInstanceでは参照カウントm_dwRefはゼロのまま。
QueryInterfaceではm_dwRefがインクリメントされる。
呼び出し側が参照をやめれば、勝手にm_dwRefがデクリメントされ、
CreateInstanceで作ったクラスのデストラクタが呼ばれる。
ちなみにデクリメントしたい場合は、Releaseを呼ぶ。
QueryInterfaceせず、呼び出し側に参照をさせないのであれば、
CreateInstanceして、色々使って、最後に消す必要も無く勝手に消えるんだろうと思っていた。
だってm_dwRefはゼロのままだからね?
ところが、これだと消えてくれないのだ。
CreateInstance
AddRef
いらなくなったらRelease
これでCreateInstanceで作ったインスタンスのデストラクタが動く。
AddRefでm_dwRefがインクリメントされ、
Releaseでデクリメントされる。
それだけにしか見えないんだけど、それやらないとデストラクタが動かない。
0 件のコメント:
コメントを投稿