成員函數(shù)的調(diào)用是編譯器內(nèi)部使用的 __thiscall 即需要this指針,
所以我們調(diào)用成員函數(shù)必須滿足的條件是
1 需要this指針,
2 成員函數(shù)有固定的函數(shù)地址
先看條件 1 ?
this指針是在函數(shù)調(diào)用前用ECX寄存器傳入的,
所以我們只需要提前講this指針賦值給ECX即可
條件2
成員函數(shù)是有固定的地址的,也就是說(shuō)我們可以直接調(diào)用,不過(guò)大多數(shù)情況下因?yàn)橐L問(wèn)成員變量,所以如果沒(méi)有this指針,會(huì)在訪問(wèn)時(shí)產(chǎn)生異常.對(duì)于不需要this指針的成員函數(shù)可以正常調(diào)用.
如類 CTest
class?CTest
{
public
:

?CTest()?:?m_nData?(
5
){}

?
int
?GetNum(){reutrn?
3
;]

?
int
?GetAmount(){return?
2
?
+
?m_nData;}
private
:
?
int
?m_nData;
};


//
可以這樣調(diào)用GetNum
return?((CTest
*
)
0
)
->
GetNum();

這兩個(gè)條件都可以滿足,所以代碼如下:
typedef?int?(CTest::*GETAMOUNT)();

void?Process(CTest&?t?,?GETAMOUNT?GetAmont)
{
??int?nResult?=0;
??__asm{
?????mov?ecx,[t]??????;傳入this指針
?????call?GetAmont????;調(diào)用成員函數(shù)
?????mov?nResult,?eax?;返回值在EAX中
????????}
??cout<<nResult<<endl;
}

int?main(int?argc,?char*?argv[])
{
??CTest?test;

??Process(test,?&CTest::GetAmount);????
??return?0;
}????
