直接调用类成员函数地址

http://tech.ddvip.com   2008年03月27日    社区交流

内容摘要:介绍了如何取成员函数的地址以及调用该地址.

class tt
{
public:
  void foo(int x,char c,char *s)//没有指定类型,默认是__thiscall.
  {
    printf("
m_a=%d, %d,%c,%s
",m_a,x,c,s);
  }
  int m_a;
};
typedef void (__stdcall *FUNCTYPE)(int x,char c,char *s);//定义对应的非成员函数指针类型,注意指定__stdcall.
  tt abc;
  abc.m_a = 123;
  DWORD ptr;
  DWORD This = (DWORD)&abc;
  GetMemberFuncAddr_VC6(ptr,tt::foo); //取成员函数地址.
  FUNCTYPE fnFooPtr = (FUNCTYPE) ptr;//将函数地址转化为普通函数的指针.
  __asm //准备this指针.
  {
    mov ecx, This;
  }
  fnFooPtr(5,'a',"7xyz"); //象普通函数一样调用成员函数的地址.

  对其它类型的成员函数,我们只要申明一个与原成员函数定义完全类似的普通函数指针,但在参数中最左边加一个void * 参数。代码如下:

class tt
{
public:
  void __stdcall foo(int x,char c,char *s)//成员函数指定了__stdcall调用约定.
  {
    printf("
m_a=%d, %d,%c,%s
",m_a,x,c,s);
  }
  int m_a;
};
typedef void (__stdcall *FUNCTYPE)(void *This,int x,char c,char *s);//注意多了一个void *参数.
  tt abc;
  abc.m_a = 123;
  DWORD ptr;
  GetMemberFuncAddr_VC6(ptr,tt::foo); //取成员函数地址.
  FUNCTYPE fnFooPtr = (FUNCTYPE) ptr;//将函数地址转化为普通函数的指针.
  fnFooPtr(&abc,5,'a',"7xyz"); //象普通函数一样调用成员函数的地址,注意第一个参数是this指针.
  每次都定义一个函数类型并且进行一次强制转化,这个事是比较烦的,能不能将这些操作写成一个函数,然后每次调用是指定函数地址和参数就可以了呢?当然是可以的,并且我已经写了一个这样的函数。

来源:vckbase    作者:南风    责编:豆豆技术应用

正在加载评论...