如何获取COM对象的成员函数的地址?

时间:2016-04-23 15:40:25

标签: c++ com member-function-pointers

我有一个指向COM对象的指针,pfoo实现了IFoo。我想获得pfoo-> Bar()的地址,它是IFoo的一种方法。由于COM对象有很好的文档记录,因此这应该非常简单。事实上,确实如此。如果Bar()是接口中的第五个方法(当然是IUnknown方法的会计),则可以从vtable中提取地址

(*(void***)(pfoo))[5]

我的问题是,有没有办法做到这一点,而不必使用" 5"?似乎容易出错,不得不计算方法。我只想使用方法名称。我不介意它是否有点复杂;无论如何,这都是宏观的。所以我的最终问题是,是否存在一个宏,它接受参数pfoo,Bar和IFoo,并计算上面的表达式?

1 个答案:

答案 0 :(得分:0)

不,没有宏可以做到这一点。如果你想这样做,这是你的葬礼。

请不要忘记,如果您的接口是从IUnknown派生的,那么第5个函数不是接口中的第5个函数,而是第8个函数,因为在接口中的第一个方法之前有QueryInterface,AddRef和Release- - 不一定按此顺序。如果您是从IDispatch派生的,那么在第一种方法之前还有更多方法。

如果查看MFC源代码,他们会使用一些宏在METHOD_PROLOGUE()宏中执行类似的操作。它使用标题为“offsetof()”的宏或MS编译器黑客。我不知道它是什么,我不倾向于查找,但由于MS提供源代码,你应该能够做到。

编辑:我只是用Google搜索它,看起来offsetof()是一个stddef.h宏。 https://en.wikipedia.org/wiki/Offsetof