2016-04-23 20 views
0

Ich habe einen Zeiger auf ein COM-Objekt pfoo implementiert IFoo. Ich möchte die Adresse von pfoo-> Bar(), eine der Methoden von IFoo. Da COM-Objekte recht gut dokumentiert sind, sollte dies ziemlich einfach sein. Und tatsächlich ist es so. Wenn Bar() ist, sagen wir, die fünfte Methode in der Schnittstelle (Buchhaltung natürlich für die IUnknown-Methoden) kann die Adresse aus dem Vtable mitWie kann ich die Adresse der Elementfunktion eines COM-Objekts abrufen?

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

Meine Frage ist, extrahiert werden, ist es eine Möglichkeit, zu tun dies ohne "5" zu verwenden? Es scheint fehleranfällig zu sein, die Methoden zu zählen. Ich möchte nur den Methodennamen verwenden. Es macht mir nichts aus, wenn es ein bisschen komplex ist; Das alles läuft sowieso in einem Makro. Meine ultimative Frage ist also, ob es ein Makro gibt, das die Parameter pfoo, Bar und vielleicht IFoo annimmt und zu dem obigen Ausdruck führt?

+1

Könnte es sein, dass das, was Sie wirklich wollen, die 'IDispatch'-Implementierung ist? –

+0

C++ scheint es nicht zuzulassen, dass Sie einen Zeiger auf eine Elementfunktion von einer Klasseninstanz erfassen. Sie müssen Zugriff auf die Klasse haben, die IFoo implementiert, dann können Sie 'auto pBar = & CFoo :: Bar;' sagen. Da "& pFoo-> Bar" NICHT akzeptiert wird, gibt es keine Möglichkeit, ein Makro zu erstellen, das die Ordnungszahl der Methoden nicht akzeptiert. –

Antwort

0

Nein, es gibt kein Makro, das zu tun. Es ist deine Beerdigung, wenn du das willst.

Vergessen Sie nicht, dass, wenn Ihre Schnittstelle von IUnknown abgeleitet ist, die fünfte Funktion nicht die fünfte Funktion in der Schnittstelle ist, sondern die achte, weil es vor der ersten Methode in der Schnittstelle QueryInterface, AddRef und Release gibt - Nicht unbedingt in dieser Reihenfolge. Wenn Sie von IDispatch abgeleitet sind, gibt es noch mehr Methoden vor Ihrer ersten Methode.

Wenn Sie MFC-Quellcode betrachten, verwenden sie einige Makros, um einige ähnliche Dinge in ihrem Makro METHOD_PROLOGUE() zu tun. Es verwendet entweder einen Makro- oder MS-Compiler-Hack mit dem Titel "offsetof()". Ich weiß nicht, was es ist und ich bin nicht geneigt, nachzuschlagen, aber da MS den Quellcode bereitstellt, sollten Sie es tun können.

Edit: Ich habe es nur gegoogelt und es scheint, dass offsetof() ist ein Makro stddef.h. https://en.wikipedia.org/wiki/Offsetof