假设我有一个 COM 接口(interface)指针
IMyInterface *pInterface = 0x12696340;
我可以通过函数调用从调试器中看出这必须由 CMyImplementer 实现,但该类位于 0x12686e50。
我的问题是,COM 如何将接口(interface)与实现类联系起来?必须有某种方法可以将接口(interface)指针转换为类指针 - 如何做到这一点?
最佳答案
在我熟悉的一个实现中,会发生以下情况。不确定这种布局有多普遍,但它可能会让您了解什么是可能的。
类在内存中的布局,在 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. ]
内存中的其他地方(该类的所有对象的一个实例):
[ (12 bytes) vtable for CoYourClass::IUnknown ]
[ (28 bytes) vtable for CoYourClass::IDispatch ]
[ (4*n bytes) vtable for CoYourClass::IMyInterface ] <---- (*pInterface) points here
vtable 中的条目指向 thunk。当调用pInterface->Foo();
时,会取出Foo
对应的vtable表项,也就是thunk的代码地址。该 thunk 接收 pInterface
作为其 this
指针。 thunk 知道它是 CoYourClass 类中的 IMyInterface thunk,在这种情况下它减去 8
字节的固定偏移量以检索指向对象开头的指针。然后 thunk 调用您为实现 Foo
而编写的实际代码,将调整后的指针作为 this
传递。
OP 注意事项:您可以通过在调用对象时检查调试器中的内存和变量来确定编译器使用的布局(如果调试器允许您从客户端代码单步进入进程内对象的服务器代码,则最简单)
关于c++ - COM 接口(interface)指针与实现类有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29156516/