2016-04-23 85 views
0

我有一個指向一個COM對象pfoo實現IFoo的指針。我想獲得pfoo-> Bar()的地址,它是IFoo的一種方法。由於COM對象有很好的文檔記錄,所以這應該很容易。事實上,它是。如果酒吧()是,比如說,在接口的第五種方法(會計課程IUnknown方法的),地址可以從虛表中提取與如何獲取COM對象的成員函數的地址?

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

我的問題是,有沒有辦法做到這不需要使用「5」?看起來很容易出錯,不得不數數這些方法。我只想使用方法名稱。我不介意它是否有點複雜;無論如何,這都是宏觀的。所以我的最終問題是,是否存在一個採用參數pfoo,Bar和IFoo的宏,並對上述表達式求值?

+1

難道你真的想要的是'IDispatch'實現嗎? –

+0

C++似乎不想讓你從類實例中捕獲一個指向成員函數的指針。你需要訪問實現IFoo的類,然後你可以說'auto pBar =&CFoo :: Bar;'。鑑於它不會接受'&pFoo-> Bar',沒有辦法構造一個不採用方法序數的宏。 –

回答

0

不,沒有一個宏來做到這一點。這是你的葬禮,如果你想這樣做。

只是不要忘記,如果你的接口是從IUnknown派生的,那麼第5個函數不是接口中的第5個函數,而是第8個接口中的第一個方法之前有QueryInterface,AddRef和Release - 不一定按此順序。如果您是從IDispatch派生的,則在第一個方法之前還有更多的方法。

如果你看看MFC的源代碼,他們使用一些宏在他們的METHOD_PROLOGUE()宏中做一些類似的事情。它使用名爲「offsetof()」的宏或MS編譯器hack。我不知道它是哪個,也不傾向於查看它,但是由於MS提供了源代碼,因此您應該可以這樣做。

編輯:我只是GOOGLE了它,它似乎offsetof()是一個stddef.h宏。 https://en.wikipedia.org/wiki/Offsetof