VC++函数,类函数调用过程

2026-05-07
实现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