C++ COM接口指针与实现类的关系如何?

C++ COM接口指针与实现类的关系如何?,c++,windows,com,C++,Windows,Com,假设我有一个COM接口指针 IMyInterface *pInterface = 0x12696340; 通过跟随函数调用,我可以从调试器中看出这必须由CMyImplementer实现,但该类位于0x12686e50 我的问题是,COM如何将接口与实现类联系起来?必须有某种方法将接口转换为类指针-如何转换?COM通常不需要接口指针指向同一物理对象;这取决于每个特定COM对象的实现。但是,任何逻辑对象的IUnknown指针必须相等,并用作对象标识。因此,当您需要检查标识时,您可以对IUnknow

假设我有一个COM接口指针

IMyInterface *pInterface = 0x12696340;
通过跟随函数调用,我可以从调试器中看出这必须由CMyImplementer实现,但该类位于0x12686e50


我的问题是,COM如何将接口与实现类联系起来?必须有某种方法将接口转换为类指针-如何转换?

COM通常不需要接口指针指向同一物理对象;这取决于每个特定COM对象的实现。但是,任何逻辑对象的
IUnknown
指针必须相等,并用作对象标识。因此,当您需要检查标识时,您可以对
IUnknown
进行
QueryInterface
并检查该指针。

以下是在我熟悉的一个实现中发生的情况。不确定这个布局有多普遍,但它可能会让你知道什么是可能的

在32位模式下,类在内存中的布局如下所示:

[ (4 bytes) ptr to vtable for IUnknown ]
[ (4 bytes) ptr to vtable for IDispatch ]
[ (4 bytes) ptr to vtable for IMyInterface ]     <--- pInterface points to here
[ (....) member variables of the class implementing CoYourClass etc. ]
[(4字节)为IUnknown从ptr到vtable]
[(4字节)IDispatch的ptr到vtable]

[(4字节)ptr到vtable for IMyInterface]有趣。我实际上是在寻找一个调试器解决方案,而不是一个代码解决方案,所以我显然不能从调试器调用QueryInterface。我想知道运行时如何将接口指针映射到实现object@Ben:如我所写,这取决于COM对象实现。没有保证公共运行时可以执行此操作。它可以是完全临时的。@Ben:如果你有对象的源代码,那么你可以阅读它来确定对象是如何实现的。如果您不知道-您在调试器中具体是如何进入实现的?
必须有某种方式从接口转换到类指针
为什么必须有?众所周知,COM对象是在VisualBasic中实现的,它背后没有“类”这样的东西。你认为你需要这些信息做什么?你想解决什么问题?vtable本身不是对象实例的一部分,只有vtable指针是。实际上,
pInterface
指向自己指向
IMyInterface
vtable的四个字节。按照您的方式,不可能有两个不同的
IMyInterface
指针引用两个不同的
CoYourClass
实例(因为所有
CoYourClass
实例共享相同的vtable)。这都是假设教科书中的“从接口派生的类”实现。还有许多其他可能的实现技术。0x12696340-0x12686e50=0xF4F0。没有类实现15676个接口。@IgorTandetnik我想我的图表显示了您刚才描述的内容?假设pInterface的值为0x1008,那么对象的值为0x1000;地址0x1008包含地址0x5000,它是CoYourClass::IMyInterface的vtable的开始。该类的不同实例将具有不同的IMyInterface opinter,例如0x1108(对于0x1100处的对象;地址0x1108又是0x5000)。@MattMcNabb你是对的。我看错了图表。未能理解
(*pInterface)点中星号的重要性。请接受我诚挚的道歉。
[ (12 bytes) vtable for CoYourClass::IUnknown ]
[ (28 bytes) vtable for CoYourClass::IDispatch ]
[ (4*n bytes) vtable for CoYourClass::IMyInterface ]    <---- (*pInterface) points here