c++与汇编中typedef函数指针的比较

前天在看代码的时候有看到 用函数指针进行函数调用,下面是例子(作用是设置窗体透明度)

typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); //定义函数指针
   MYFUNC fun = NULL;   //先将其赋为空值
   fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); //在链接库中得到地址

if(fun)

    fun(this->GetSafeHwnd(),0,128,2);    //执行函数
      FreeLibrary(hInst);

typedef 的使用看到过很多回了,平时用的也就是 用来定义结构体,再者就是定义函数指针了。

好处: 用 typedef 有很多好处,创建易于记忆的类型名,就像上面的这段代码一样,它可以告诉编译器要压栈哪些参数让编译器进行检查,因为如果自己没有对函数进行申明的话,编译器是不知道如何处理函数的参数的,所以 typedef 就起到了这个作用, 当然你也可以在高级语言中嵌入 汇编 指令

__asm

{

      push 2 //参数

      push 1 //参数

     mov eax, fun

     call eax
}

如此作法也是可以的,但是修改起来不顺眼,编写麻烦。

参见另外的 typedef 定义 http://baike.baidu.com/view/1283800.htm 其中有 typedef 的很多定义

另外在 win32 汇编中也有类似的函数指针:

    例:

       _PROCVAR2 typedef proto: dword, :dword

       _PROCVAR0 typedef proto

       PROCVAR0    typedef ptr _PROCVAR0

       PROCVAR2    typedef ptr   _PROCVAR2

      ;;这样定义后就可以用来像高级语言那样来定义函数指针了,返回的参数,当然就是在默认的 eax 中了

      ;;函数指针定义"

    lpProc0        PROCVAL0           ?   ;未初始化值

    lpProc2        PROCVAL2           ?

    这样就可以像高级语言那样在动态链接库中搜索函数地址,然后用

    invoke lpProc0

     invoke lpProc2, 1, 2

    来进行参数调用了~~~~

    当然在汇编中 直接用 call 是最方便的,但是用伪指令有助于检查错误

转载于:https://www.cnblogs.com/satng/archive/2010/07/02/2138886.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值