回調函數(__stdcall)

2 過程語言中的回調(C)


2.1 函數指針
回調在C語言中是通過函數指針來實現的,通過將回調函數的地址傳給被調函數從而實現回調。因此,要實現回調,必須首先定義函數指針,請看下面的例子:

void Func(char *s);// 函數原型
void (*pFunc) (char *);//函數指針

可以看出,函數的定義和函數指針的定義非常類似。

一般的化,爲了簡化函數指針類型的變量定義,提高程序的可讀性,我們需要把函數指針類型自定義一下。

typedef void(*pcb)(char *);

回調函數可以象普通函數一樣被程序調用,但是隻有它被當作參數傳遞給被調函數時才能稱作回調函數

 

 3 面嚮對象語言中的回調(C++)

 回調函數必須是標準調用 __stdcall,用戶調用也以以,不過意義不大。回調一定是__stdcall ,但是__stdcall不一定是回調

  許多程序員都發現,利用MFC或者其它的C++應用編寫回調函數是非常麻煩的,其根本原因是回調函數是基於C編程的Windows SDK的技術,不是針對C++的,程序員可以將一個C函數直接作爲回調函數,但是如果試圖直接使用C++的成員函數作爲回調函數將發生錯誤,甚至編譯就不能通過。通過查詢資料發現,其錯誤是普通的C++成員函數都隱含了一個傳遞函數作爲參數,亦即“this”指針,C++通過傳遞一個指向自身的指針給其成員函數從而實現程序函數可以訪問C++的數據成員。這也可以理解爲什麼C++類的多個實例可以共享成員函數但是確有不同的數據成員。由於this指針的作用,使得將一個CALLBACK型的成員函數作爲回調函數安裝時就會因爲隱含的this指針使得函數參數個數不匹配,從而導致回調函數安裝失敗。要解決這一問題的關鍵就是不讓this指針起作用,通過採用以下兩種典型技術可以解決在C++中使用回調函數所遇到的問題。這種方法具有通用性,適合於任何C++。

 方法:

1). 不使用成員函數,直接使用普通C函數,

2). 使用靜態成員函數,靜態成員函數不使用this指針作爲隱含參數,這樣就可以作爲回調函數了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章