Statischer Methoden-Zeiger -> Zuweisung
-
Hallo, ich wollte mal fragen, ob sich folgendes eleganter lösen lässt:
class myclass { public: static void (*hallo)(); }; void (*myclass::hallo)() = (void (*)())1234;Ich versuche mit einer Filter-DLL auf die Klassen einer fremden Anwendung zugreifen, deswegen brauch ich unbedingt function-pointer.
Das führt mich gleich zu meiner 2. Frage:
Kann man aus einer statischen methode auf Self zugreifen?MfG
-
(ich nehme an, du meinst "this" und nicht "Self")
gegenfrage: worauf soll this zeigen, wenn es kein objekt gibt, für dass die statische methode aufgerufen wird? (es gibt keinen this-zeiger)
zum thema eleganz.
mir ist nicht ganz klar, was du als elegant empfinden würdest.
vielleicht ein einfaches typedef?typedef void (*fun_ptr_t) (); class Foo { public: static fun_ptr_t fun; }; fun_ptr_t Foo::fun = ....;oder
tr1::function?#include <tr1/functional> class Foo { public: static std::tr1::function<void()> fun; }; std::tr1::function<void()> fun = ....;
-
queer_boy schrieb:
(ich nehme an, du meinst "this" und nicht "Self")
gegenfrage: worauf soll this zeigen, wenn es kein objekt gibt, für dass die statische methode aufgerufen wird? (es gibt keinen this-zeiger)Japp, war ein kleiner Denkfehler - Self wärs in Delphi.
Also so wies aussieht geht es also mit einer statischen Methode nicht...
Mein Problem ist nämlich dass - nach Aufruf der Methode - this im ECX-Register (wo es normal auch hingehört) liegen muss und das für jede (gehookte) Methode in Assembler zu bewerkstelligen wäre viel zu aufwendig.Gibt es denn keine andere Möglichkeit Klassenfunktionen auf eine andere Adresse "umzuleiten"?
Vll. in ASM die VTable patchen?Grüße
-
Letztlich kannst Du vermutlich alles auf void* und wieder woanders hin zurück casten ... aber ob das dann (immer) funtkioniert wie gewünscht, steht auf einem anderen Blatt.
Da der C++-Standard nichts über EXC-Register, VTables und ASM sagt, zumindestens nicht standardkonform ... und damit hängst Du auf jeden Fall in der Plattform, wenn nicht gar am Compiler.
Gruß,
Simon2.