用匯編呼叫函數的樣例,大家要注意的是呼叫後恢復堆棧(esp棧頂指針的值)現場的方法,沒有恢復,或者恢復不正確,會有大大的error報出來!
//呼叫無參數的函數
DWORD dwRet;
void CallFunc0(LPVOID lpFunc){
__asm
{
call DWORD Ptr[lpFunc]
mov dwRet ,eax
//cmp ax ,1//[esp+4]
//call DWORD Ptr[lpFunc]
}
}
//呼叫一個參數的函數
void CallFunc1(LPVOID lpFunc,DWORD param1)
{
__asm
{
push param1
call DWORD Ptr[lpFunc]
add esp ,4 //恢復棧指針
mov dwRet ,eax
}
}
//呼叫2個參數的函數
{
__asm
{
push param1
push param2
call DWORD Ptr[lpFunc]
add esp ,8 //恢復棧指針
mov dwRet ,eax
}
}
//呼叫3個參數的函數
void CallFunc3(LPVOID lpFunc,DWORD param1,DWORD param2 ,DWORD param3)
{
__asm
{
push ax
call DWORD Ptr[lpFunc]
cmp ax ,[esp-4]
call DWORD Ptr[lpFunc]
mov dwRet ,eax
}
}
void func0()
{
::MessageBox(0,0,0,0);
}
void func1(LPCTSTR lpStr)
{
::MessageBox(0,lpStr,0,0);
}
void func2(LPCTSTR lpStr ,LPCTSTR lpStr2)
{
::MessageBox(0,lpStr,lpStr2,0);
}
//這裏啓動調用
{
// TODO: Add your control notification handler code here
dwRet = 0;
CallFunc0(func0);
LPCTSTR lp1 = _T("Call func1 called!~");
CallFunc1(func1,(DWORD)lp1);
LPCTSTR lp2 = _T("Call func2 called!~");
CallFunc2(func2,(DWORD)lp1,(DWORD)lp2);
}