c++與彙編中typedef函數指針的比較

前天在看代碼的時候有看到 用函數指針進行函數調用,下面是例子(做用是設置窗體透明度)函數

typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); //定義函數指針
   MYFUNC fun = NULL;   //先將其賦爲空值
   fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); //在連接庫中獲得地址this

if(fun)指針

    fun(this->GetSafeHwnd(),0,128,2);    //執行函數
      FreeLibrary(hInst);htm

typedef 的使用看到過不少回了,平時用的也就是 用來定義結構體,再者就是定義函數指針了。get

好處: 用 typedef 有不少好處,建立易於記憶的類型名,就像上面的這段代碼同樣,它能夠告訴編譯器要壓棧哪些參數讓編譯器進行檢查,由於若是本身沒有對函數進行申明的話,編譯器是不知道如何處理函數的參數的,因此 typedef 就起到了這個做用, 固然你也能夠在高級語言中嵌入 彙編 指令編譯器

__asmasm

{編譯

      push 2 //參數class

      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 是最方便的,可是用僞指令有助於檢查錯誤

相關文章
相關標籤/搜索