如果我有一个C ++类,X,它实现了COM接口IY和IZ,我有一个指针y以X类型的对象的IY接口,并且我这样做:
IZ *z = dynamic_cast<IZ *> ( y );
这并不撞击对象的引用计数,不是吗? 我没有做一个版本()考虑到,对不对?
如果它的事项,我使用ATL / COM。
我猜的答案是“没有也碰到引用计数,并没有你不必释放()”,但我想确认一下。
提前致谢。
如果我有一个C ++类,X,它实现了COM接口IY和IZ,我有一个指针y以X类型的对象的IY接口,并且我这样做:
IZ *z = dynamic_cast<IZ *> ( y );
这并不撞击对象的引用计数,不是吗? 我没有做一个版本()考虑到,对不对?
如果它的事项,我使用ATL / COM。
我猜的答案是“没有也碰到引用计数,并没有你不必释放()”,但我想确认一下。
提前致谢。
当有人呼叫的IUnknown ::的AddRef()为COM对象的引用计数递增。 的QueryInterface(),根据COM规则,因为它给出了一个新的接口指针,内部调用的AddRef()。
在您发布的代码,你不调用的AddRef(),和你不打电话,可能调用的AddRef()的任何功能,那么,为什么你认为引用计数将递增?
尽管什么ATL / MFC做一个人的大脑,没有介入的法宝。 如果有疑问,可以随时查看VS拆卸,并通过它一步并证明自己,的AddRef()不会被调用。
编辑:我想重申Dewfy说, 不这样做 。 使用的QueryInterface()。 或CComQIPtr <>(如果你必须)。
进一步编辑:如果您使用但是CComPtr <>和CComQIPtr <>,那么你不必调用Release()和很多找出正确的裁判计数的负担减轻。 你真的应该考虑使用它们。
dynamic_cast的不得在多种原因被使用:
而是使用的QueryInterface - 它会做你想要什么。
即使你在上面的问题肯定 - 铸造不会改变refcounter
在C ++ Builder中, dynamic_cast
上的COM接口指针实际上做QueryInterface
。 并且返回的指针,如果QI成功,得到AddRef
“d。
它实现COM对象的类有不同的虚函数表布局,以更一般的C ++类,所以C ++ -风格dynamic_cast
不能工作; 所以我想这也是为什么C ++ Builder中确实做的QueryInterface的更明智的事情。
(COM的最初的想法是概括C ++对象模型为与语言无关,为二进制标准;它们更名的dynamic_cast到的QueryInterface)。
我猜顶答案指的是MSVC,如果将dynamic_cast会导致不确定的行为。