抱歉,如果这个问题对每个人来说都是显而易见的,但我对COM还很陌生。从我在这里看到的教程http://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567,似乎每个用C++创建的COM类都必须实现自己的QueryInterface、AddRef和Release。由于这些方法对于任何新类都应该具有基本相同的实现,所以我不明白为什么没有一些抽象类或为开发人员实现它的任何东西。我不明白为什么我要重新实现这么多人已经一次又一次实现的相同东西(除非教程有误并且确实有问题)。谢谢 最佳答案
我有以下COM接口(interface)层次结构和一个实现它们的类:interfaceIX:publicIUnknown{};interfaceIY:publicIUnknown{};classCA:publicIX,publicIY{};这里classCA有效地继承自IUnknown两次。我们知道在classCA中有两个vtable指针-一个指向IX,另一个指向IY。所以IX子对象中存储的IUnknown与IY子对象中存储的IUnknown是不同的。然而,当我们在同一对象上调用IX::QueryInterface()或IY::QueryInterface()并查询IUnknown时,
查看我们的代码,我在一个.idl文件中发现了一个奇怪的定义:[object,uuid(uuidhere),dual,nonextensible,oleautomation,hidden]interfaceIOurInterface:IUnknown{//methodshere};直接从IUnknown派生的接口(interface)怎么可能是双重接口(interface)?如果我删除dual属性,是否会出现任何问题? 最佳答案 在thisanswer关于编码的另一个问题uservoyce指向thisarticle基本上说明了以下内容
从例子中我看到COMIUnknown::Release()函数实现是这样的:ULONGRelease(){InterlockedDecrement(&m_count);if(m_count==0){deletethis;}returnm_count;}因此,如果m_count为0,那么我们将删除“this”对象,并返回引用计数。我不明白的是为什么它有效?!?!删除对象不会破坏调用堆栈,或者因为它被线程占用,所以它与对象无关吗???如果对象被删除了,怎么可能返回m_count,应该是被删除了。我本可以说服自己,如果删除后代码返回硬编码0没关系,但它怎么会返回成员?!?!非常感谢您的帮助!