簡體   English   中英

如何獲得COM對象的成員函數的地址?

[英]How can I get the address of a COM object's member function?

我有一個指向COM對象的指針,pfoo實現了IFoo。 我想獲取IFoo的方法之一pfoo-> Bar()的地址。 由於COM對象已被很好地記錄,因此這應該很容易。 實際上是這樣。 如果說Bar()是接口中的第五種方法(當然要考慮IUnknown方法),則可以使用以下方法從vtable中提取地址:

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

我的問題是,有沒有辦法不必使用“ 5”來執行此操作? 必須累加方法似乎容易出錯。 我只想使用方法名稱。 我不介意它是否有點復雜; 無論如何,這都是一個宏。 因此,我的最終問題是,是否存在一個宏,該宏帶有參數pfoo,Bar以及IFoo,並計算為上面的表達式?

不,沒有宏可以執行此操作。 如果要這樣做,這是您的葬禮。

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

如果您查看MFC源代碼,它們將使用一些宏在其METHOD_PROLOGUE()宏中執行一些類似的操作。 它使用名為“ offsetof()”的宏或MS編譯器黑客。 我不知道它是什么,也不願意查找它,但是由於MS提供了源代碼,因此您應該能夠做到。

編輯:我只是谷歌搜索,似乎offsetof()是一個stddef.h宏。 https://zh.wikipedia.org/wiki/Offsetof

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM