前天在看代碼的時候有看到 用函數指針進行函數調用,下面是例子(做用是設置窗體透明度)函數
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 是最方便的,可是用僞指令有助於檢查錯誤