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 是最方便的,但是用伪指令有助于检查错误

  • 相关阅读:
    断点续传的原理
    中国无线音乐搜索综合测评结果
    从头开始学jsp
    SQLServer和Oracle常用函数对比
    Asp.net程序重启自己
    What Can I do if "The type initializer for 'Emgu.CV.CvInvoke' threw an exception"?
    C++Builder2010多线程调用WebService的问题
    Desmon and Penny
    C#显示摄像头预览
    甲骨文78亿美金并购全球第二芯片商AMD
  • 原文地址:https://www.cnblogs.com/mokliu/p/2138886.html
Copyright © 2011-2022 走看看