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?
Könnte es sein, dass das, was Sie wirklich wollen, die 'IDispatch'-Implementierung ist? –
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. –