Chinaunix首页 | 论坛 | 博客
  • 博客访问: 735321
  • 博文数量: 769
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 4985
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:37
文章分类

全部博文(769)

文章存档

2011年(1)

2008年(768)

我的朋友

分类:

2008-10-15 16:40:09

    这两天在研究在下实现的反射机制的可能性,的出的结论是可行的,具体参看我上一主题实现的反射实例。现在顺便把研究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

[1]  

【责编:huangchunmei】

--------------------next---------------------

阅读(397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~