程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC++語言中函數和類函數調用過程

VC++語言中函數和類函數調用過程

編輯:關於VC++

這兩天在研究在C++下實現的反射機制的可能性,得出的結論是可行的,具體參看我上一主題實現C++的反射實例。現在順便把研究C++反射機制過程中函數的調用過程寫一下。利用此特性寫了一個通用的 函數轉發器,可以調用任何的API函數。

// 初始化映射工廠

InitializeMappingFactory();

IMOKE_METHOD(NULL,&Messagebox,NULL,"hello world.","你好", MB_OK);

在後面加任何東西都不會出錯,而且很方便的繞過編譯器的參數校驗,比如:

IMOKE_METHOD(NULL,&Messagebox,NULL,"hello world.","你好", MB_OK,"123456","7892737");

都沒有問題。

好了跑題了,繼續說正題:

1. 無返回值的函數調用方法

a. 參數為普通變量,即: int long ulong 和指針

void SetValue(LONG f_Val)
{
f_Val 獲取方式為 mov eax, [ebp + 8]
}
SetValue(xxx); 的調用方式為
push xxx
call SetValue

b. 參數為類對象,如:CString

void SetValue(std::string f_Val)
{
f_Val 獲取方式為 lea eax, [ebp + 8]
}

SetValue(xxx);的調用方式為

esp -> 生成xxx的臨時對象 std::string

call SetValue

c. 如果參數以引用方式調用

void SetValue(std::string &f_Val)
{
f_Val 獲取方式為 mov eax, [ebp + 8]
}

SetValue(xxx);的調用方式為

lea eax, xxx
push eax
call SetValue

d. 如果是類調用方法與之一樣,區別是 ECX -> 指向對象,具體如下所示

void XXX::SetValue(LONG f_Val)
{
ecx -> XXX對象
f_Val 獲取方式為 mov eax, [ebp + 8]
}

a.SetValue(xxx); 調用方式為

push xxx
mov ecx,a
call XXX::SetValue
void XXX::SetValue(std::string f_Val)
{
ecx -> XXX對象
f_Val 獲取方式為 lea eax, [ebp + 8]
}

a.SetValue(xxx);的調用方式為

esp -> 生成xxx的臨時對象 std::string

mov ecx,a
call XXX::SetValue
void XXX::SetValue(std::string &f_Val)
{
ecx -> XXX對象
f_Val 獲取方式為 mov eax, [ebp + 8]
}

a.SetValue(xxx);的調用方式為

lea eax, xxx
push eax
mov ecx,a
call XXX::SetValue

2.有返回值的函數調用方法同上,區別就在返回值的處理上

a. 參數為普通變量,即: int long ulong 和指針

LONG SetValue(LONG f_Val)
{
f_Val 獲取方式為 mov eax, [ebp + 8]
}

b = SetValue(xxx); 的調用方式為

push xxx
call SetValue
mov b, eax

b. 參數為類對象,如:CString

std::string SetValue(std::string f_Val)
{
f_Val 獲取方式為 lea eax, [ebp + 8]
}

b = SetValue(xxx); 的調用方式為

esp -> 生成xxx的臨時對象 std::string

lea eax, b
push eax
call SetValue

c. 如果參數以引用方式調用

std::string SetValue(std::string &f_Val)
{
f_Val 獲取方式為 mov eax, [ebp + 8]
}

b = SetValue(xxx); 的調用方式為

lea eax, xxx
push eax
lea eax, b
push eax
call SetValue

d. 如果是類調用方法與之一樣,區別是 ECX -> 指向對象,具體如下所示

LONG XXX::SetValue(LONG f_Val)
{
ecx -> XXX對象
f_Val 獲取方式為 mov eax, [ebp + 8]
}

b = a.SetValue(xxx) 調用方式為

push xxx
mov ecx,a
call XXX::SetValue
mov b, eax
std::string XXX::SetValue(std::string f_Val)
{
ecx -> XXX對象
f_Val 獲取方式為 lea eax, [ebp + 8]
}

b = a.SetValue(xxx)的調用方式為

esp -> 生成xxx的臨時對象 std::string

lea eax, b
push eax
mov ecx,a
call XXX::SetValue
std::string XXX::SetValue(std::string &f_Val)
{
ecx -> XXX對象f_Val 獲取方式為 mov eax, [ebp + 8]
}

b = a.SetValue(xxx)的調用方式為

lea eax, xx
push eax
lea eax, b
push eax
mov ecx,a
call XXX::SetValue

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved