Войти
ПрограммированиеФорумОбщее

Как узнать адрес функции в классе? (2 стр)

Страницы: 1 2
#15
12:39, 27 июля 2009

Ну не знаю, вот просто от безделья написал пример, код конечно не безопасный xD))(наверно)

#include <iostream>

using namespace std;

class A
{
public:
  int speak(void)
  {
    cout << "A::speak\n";
    return 1;
  }
};
typedef int (A::*AF)(void);
typedef int (__stdcall *F)(void);
int main()
{
  A* p = new A;

  AF a = &A::speak;
  F b;

  __asm
  {
    mov eax, A::speak
    mov b, eax
  }

  //Один и тот же адрес функции
  printf("a = %X\n", a);
  printf("b = %X\n", b);

  __asm
  {
    mov ecx, p
  }
  b();

  (p->*a)();

  p->speak();
  
  return 0;
}

И вот ASM код вызова 3х функций

; Line 33
  mov  ecx, DWORD PTR _p$[ebp]
; Line 35
  call  DWORD PTR _b$[ebp]

; Line 37
  mov  ecx, DWORD PTR _p$[ebp]
  call  DWORD PTR _a$[ebp]

; Line 40
  mov  ecx, DWORD PTR _p$[ebp]
  call  ?speak@A@@QAEHXZ      ; A::speak

P.S. Тестировал на VS 2008 Express Edition


#16
18:29, 27 июля 2009

Duplex
головка бобо?

#17
19:23, 27 июля 2009

Ну да. ну да

#18
20:50, 27 июля 2009

Duplex
> код конечно не безопасный xD))(наверно)

#include <iostream>
class A {
  public:
    void f() {
      std::cout << "f()" << std::endl;
    }
};
int main(int argc,char** argv)
{
  union {
    void (*free_fn_ptr) ();
    void (A::*member_fn_ptr) ();
  } ptrs;
  ptrs.member = &A::f;
  (reinterpret_cast<A*>(0)->*ptrs.member_fn_ptr)();
  (*ptrs.free_fn_ptr)();
  return 0;
}
#19
20:56, 27 июля 2009

Спасибо!! Такого метода точно не видел.

Страницы: 1 2
ПрограммированиеФорумОбщее

Тема в архиве.