Interface 将COM对象动态转换为COM接口不会';不要破坏引用计数,是吗? 如果我有一个C++类,它实现COM接口IY和IZ,并且我有一个指针Y到X对象的IY接口,我这样做: IZ *z = dynamic_cast<IZ *> ( y ); IZ*z=dynamic_cast(y);

Interface 将COM对象动态转换为COM接口不会';不要破坏引用计数,是吗? 如果我有一个C++类,它实现COM接口IY和IZ,并且我有一个指针Y到X对象的IY接口,我这样做: IZ *z = dynamic_cast<IZ *> ( y ); IZ*z=dynamic_cast(y);,interface,com,dynamic-cast,reference-counting,atlcom,Interface,Com,Dynamic Cast,Reference Counting,Atlcom,这不会影响对象的引用计数,是吗?我不必用Release()来解释它,对吗 如果重要的话,我正在使用ATL/COM 我猜答案是“不,它不会影响引用计数,不,您不必释放()”,但我想确定一下 提前感谢。不得出于多种原因使用dynamic\u cast: 您不知道目的地是否支持RTTI 您不确定OLE是否不为您创建代理 相反,使用QueryInterface-它可以实现您想要的功能 即使您在上面的问题中确定-casting不会更改refcounter当有人调用IUnknown::AddRef()

这不会影响对象的引用计数,是吗?我不必用Release()来解释它,对吗

如果重要的话,我正在使用ATL/COM

我猜答案是“不,它不会影响引用计数,不,您不必释放()”,但我想确定一下


提前感谢。

不得出于多种原因使用dynamic\u cast:

  • 您不知道目的地是否支持RTTI
  • 您不确定OLE是否不为您创建代理
相反,使用QueryInterface-它可以实现您想要的功能


即使您在上面的问题中确定-casting不会更改refcounter

当有人调用IUnknown::AddRef()时,COM对象的引用计数也会增加。QueryInterface()根据COM规则,因为它给出了一个新的接口指针,所以在内部调用AddRef()

在发布的代码中,您没有调用AddRef(),也没有调用任何可能调用AddRef()的函数,那么为什么您认为引用计数会增加呢

尽管ATL/MFC对人的大脑有什么作用,但其中并没有魔法。当有疑问时,您总是可以在VS中查看反汇编并逐步完成它,并向自己证明没有调用AddRef()

编辑:我想重申Dewfy所说的,不要这样做。使用QueryInterface()。或者CComQIPtr(如果您真的必须)


进一步编辑:如果您使用CComPtr和CComQIPtr,那么就不必调用Release(),计算正确的ref计数的负担就减轻了。在C++的Builder中,

,<代码> DyrimeSkyStudio在COM接口指针上,实际上是<代码> QueryInterface < /代码>。如果QI成功,返回的指针将获得
AddRef
'd

<>类实现COM对象的VC++布局不同于一般的C++类,因此C++风格>代码> DyrimeCase不能工作;所以我想这就是为什么C++Builder做查询接口这件更明智的事情的原因

(COM的最初思想是将C++对象模型推广为语言不可知的和二进制的标准;它们将动态转换为QueryInterface)。


我猜最重要的答案是指MSVC,如果dynamic_cast导致未定义的行为。

是,是,再次是。你甚至不知道实现是否真的是C++。使用QueryInterface()-它与dynamic_cast非常相似,无论不同的互操作问题如何都可以工作。