由于类函数成员默认情况下为__thiscall调用约定, 故很多东西受到限制.
如在取得类函数成员地址的时候, 也不能轻易调用类函数成员, 这将导致函数参数被不正确地传递。
在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对
成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针
的声明,而"->*"和".*"用来调用指针指向的函数
例:
class tt { public: void foo(int x){ printf("/n %d /n",x); } }; typedef void ( tt::* FUNCTYPE)(int ); FUNCTYPE ptr = tt::foo; //给一个成员函数指针赋值. tt a; (a.*ptr)(5); //调用成员函数指针. tt *b = new tt;
(b->*ptr)(6); //调用成员函数指针.
但在某些特殊情况下, 如拦截API. 函数的调用者并不是我们自己, 故可能无法做到此类调用. 对于此类情况,
一. 拦截处理指向的新函数用非类成员函数
二. 拦截处理指向的新函数用类静态成员函数 ( 类静态成员函数在类对象未创建之初既已分配内存及地址, 故不受__thiscall约定限制 )