c++ - COM 接口(interface)指针与实现类有何关系?

标签 c++ windows com

假设我有一个 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/

相关文章:

c++ - 查找最接近质心的几何内部点

C# COM 对象和多线程

sockets - Ada/C/++ 分布式应用程序

c++ - 无法在 QWIndow (Qt5) 中使用 OpenGL 启用深度测试

c++ - Typedef 适用于结构但不适用于枚举,仅适用于 C++

c++ - 减少线程或进程的 CPU 使用率

c# - Excel DNA - 在回调中将 C# 字符串编码到 VBA ByRef

windows - 为什么 Windows Search 会在我的 IFilter 中查询一堆奇怪的界面?

c++ - WinAPI 函数 LoadLibrary() 导致函数在执行错误期间失败

windows - docker 镜像构建卡住了