成员函数的调用是编译器内部使用的 __thiscall 即需要this指针,
所以我们调用成员函数必须满足的条件是
1 需要this指针,
2 成员函数有固定的函数地址
先看条件 1
this指针是在函数调用前用ECX寄存器传入的,
所以我们只需要提前讲this指针赋值给ECX即可
条件2
成员函数是有固定的地址的,也就是说我们可以直接调用,不过大多数情况下因为要访问成员变量,所以如果没有this指针,会在访问时产生异常.对于不需要this指针的成员函数可以正常调用.
如类 CTest
class CTest
{
public
:
CTest() : m_nData (
5
){}
int
GetNum(){reutrn
3
;]
int
GetAmount(){return
2
+
m_nData;}
private
:
int
m_nData;
};
//
可以这样调用GetNum
return ((CTest
*
)
0
)
->
GetNum();
这两个条件都可以满足,所以代码如下:
typedef int (CTest::*GETAMOUNT)();
void Process(CTest& t , GETAMOUNT GetAmont)
{
int nResult =0;
__asm{
mov ecx,[t] ;传入this指针
call GetAmont ;调用成员函数
mov nResult, eax ;返回值在EAX中
}
cout<<nResult<<endl;
}
int main(int argc, char* argv[])
{
CTest test;
Process(test, &CTest::GetAmount);
return 0;
}