zoukankan      html  css  js  c++  java
  • 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 是最方便的,但是用伪指令有助于检查错误

  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/mokliu/p/2138886.html
Copyright © 2011-2022 走看看