在C++下實(shí)現(xiàn)的反射機(jī)制的可能性的結(jié)論是可行的,具體參看我上一主題實(shí)現(xiàn)C++的反射實(shí)例?,F(xiàn)在順便把研究C++反射機(jī)制過(guò)程中函數(shù)的調(diào)用過(guò)程寫(xiě)一下。利用此特性寫(xiě)了一個(gè)通用的 函數(shù)轉(zhuǎn)發(fā)器,可以調(diào)用任何的API函數(shù)。
// 初始化映射工廠
InitializeMappingFactory();
IMOKE_METHOD(NULL,&Messagebox,NULL,"hello world.","你好", MB_OK);
在后面加任何東西都不會(huì)出錯(cuò),而且很方便的繞過(guò)編譯器的參數(shù)校驗(yàn),比如:
IMOKE_METHOD(NULL,&Messagebox,NULL,"hello world.","你好", MB_OK,"123456","7892737");
都沒(méi)有問(wèn)題。
1. 無(wú)返回值的函數(shù)調(diào)用方法
a. 參數(shù)為普通變量,即: int long ulong 和指針
void SetValue(LONG f_Val)
{
f_Val 獲取方式為 mov eax, [ebp + 8]
}
SetValue(xxx); 的調(diào)用方式為
push xxx
call SetValue
b. 參數(shù)為類對(duì)象,如:CString
void SetValue(std::string f_Val)
{
f_Val 獲取方式為 lea eax, [ebp + 8]
}
SetValue(xxx);的調(diào)用方式為
esp -> 生成xxx的臨時(shí)對(duì)象 std::string
call SetValue
c. 如果參數(shù)以引用方式調(diào)用
void SetValue(std::string &f_Val)
{
f_Val 獲取方式為 mov eax, [ebp + 8]
}
SetValue(xxx);的調(diào)用方式為
lea eax, xxx
push eax
call SetValue
// 初始化映射工廠
InitializeMappingFactory();
IMOKE_METHOD(NULL,&Messagebox,NULL,"hello world.","你好", MB_OK);
在后面加任何東西都不會(huì)出錯(cuò),而且很方便的繞過(guò)編譯器的參數(shù)校驗(yàn),比如:
IMOKE_METHOD(NULL,&Messagebox,NULL,"hello world.","你好", MB_OK,"123456","7892737");
都沒(méi)有問(wèn)題。
1. 無(wú)返回值的函數(shù)調(diào)用方法
a. 參數(shù)為普通變量,即: int long ulong 和指針
void SetValue(LONG f_Val)
{
f_Val 獲取方式為 mov eax, [ebp + 8]
}
SetValue(xxx); 的調(diào)用方式為
push xxx
call SetValue
b. 參數(shù)為類對(duì)象,如:CString
void SetValue(std::string f_Val)
{
f_Val 獲取方式為 lea eax, [ebp + 8]
}
SetValue(xxx);的調(diào)用方式為
esp -> 生成xxx的臨時(shí)對(duì)象 std::string
call SetValue
c. 如果參數(shù)以引用方式調(diào)用
void SetValue(std::string &f_Val)
{
f_Val 獲取方式為 mov eax, [ebp + 8]
}
SetValue(xxx);的調(diào)用方式為
lea eax, xxx
push eax
call SetValue