|
这两天在研究在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
|