2016-04-23 3 views
0

私はCOMオブジェクトへのポインタを持っています。pfooはIFooを実装しています。 IFooのメソッドの1つであるpfoo-> Bar()のアドレスを取得したいと思います。 COMオブジェクトは非常によく文書化されているので、これは非常に簡単です。そして、実際にはそうです。バーは、()、たとえば、インタフェースの第五の方法(IUnknownメソッドのためのコースの会計処理)である場合、アドレスは私の質問があるCOMオブジェクトのメンバ関数のアドレスを取得するにはどうすればよいですか?

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

でのvtableから抽出することができ、実行する方法がありますこれは "5"を使用する必要はありませんか?エラーを起こしやすく、メソッドを数えなければならないようです。私はメソッド名だけを使いたい。ちょっと複雑なのであれば気にしない。いずれにしても、これはマクロ内ですべて実行されます。だから私の究極の質問は、pfoo、Bar、IFooなどのパラメータをとり、上記の式を評価するマクロが存在するかどうかです。

+1

本当に欲しいのは 'IDispatch'の実装でしょうか? –

+0

C++は、クラスインスタンスからメンバ関数へのポインタを取得させたくないようです。 IFooを実装するクラスにアクセスする必要があります。次に、 'auto pBar =&CFoo :: Bar;'と言うことができます。 '&pFoo-> Bar'を受け入れることができないので、メソッド順序を取らないマクロを構築する方法はありません。 –

答えて

0

いいえ、それを行うマクロはありません。あなたがそれをしたいなら、あなたの葬儀です。

インターフェイスがIUnknownから派生している場合、インターフェイスの5番目の関数ではなく、インターフェイスの最初のメソッドの前にQueryInterface、AddRef、およびReleaseがあるため、8番目の関数が8番目の関数ではないことを忘れないでください必ずしもその順序ではありません。 IDispatchから派生している場合は、最初のメソッドの前にさらに多くのメソッドがあります。

MFCのソースコードを見ると、いくつかのマクロを使用してMETHOD_PROLOGUE()マクロで同様のことを実行します。それは、 "offsetof()"というタイトルのマクロまたはMSコンパイラのハックを使用します。私はそれが何であるか分かりませんし、それを調べる傾向がありませんが、MSがソースコードを提供しているので、あなたはそれを実行できるはずです。

編集:私はちょうどそれをgoogledとoffsetof()は、stddef.hマクロが表示されます。 https://en.wikipedia.org/wiki/Offsetof

関連する問題