成員函數的調用是編譯器內部使用的 __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;
}????
