Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get memory address of member function?

How do I get the absolute address of a member function in C++? (I need this for thunking.)

Member function pointers don't work because I can't convert them to absolute addresses (void *) -- I need to know the address of the actual function in memory, not simply the address relative to the type.

like image 986
user541686 Avatar asked Nov 14 '11 12:11

user541686


1 Answers

There exists a syntax to get the address of the member function in MSVC (starting from MSVC 2005 IMHO). But it's pretty tricky. Moreover, the obtained pointer is impossible to cast to other pointer type by conventional means. Though there exists a way to do this nevertheless.

Here's the example:

// class declaration class MyClass { public:     void Func();     void Func(int a, int b); };  // get the pointer to the member function void (__thiscall MyClass::* pFunc)(int, int) = &MyClass::Func;  // naive pointer cast void* pPtr = (void*) pFunc; // oops! this doesn't compile!  // another try void* pPtr = reinterpret_cast<void*>(pFunc); // Damn! Still doesn't compile (why?!)  // tricky cast void* pPtr = (void*&) pFunc; // this works 

The fact that conventional cast doesn't work, even with reinterpret_cast probably means that MS doesn't recommend this casting very strongly.

Nevertheless you may do this. Of course this is all implementation-dependent, you must know the appropriate calling convention to do the thunking + have appropriate assembler skills.

like image 51
valdo Avatar answered Oct 09 '22 15:10

valdo