Получить адрес в памяти функции-члена?

Как мне получить absolute адрес функции-члена в C ++? (Мне это нужно для thunking.)

Указатели функций-членов не работают, потому что я не могу преобразовать их в абсолютные адреса ( void * ) - мне нужно знать адрес фактической функции в памяти, а не просто адрес относительно типа.

26
задан Matt 21 June 2013 в 18:02
поделиться

1 ответ

Существует синтаксис для получения адреса функции-члена в MSVC (начиная с MSVC 2005 IMHO). Но это довольно сложно. Кроме того, полученный указатель невозможно привести к другому типу указателя обычными средствами. Хотя, тем не менее, существует способ сделать это.

Вот пример:

// 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

Тот факт, что обычное приведение не работает, даже с reinterpret_cast, вероятно, означает, что MS не рекомендует это приведение очень сильно.

Тем не менее, вы можете сделать это. Конечно, все это зависит от реализации, вы должны знать соответствующее соглашение о вызовах, чтобы thunking + обладал соответствующими навыками ассемблера.

27
ответ дан 28 November 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: