Delphi基礎 回調函數及其使用
“回調機制”是window 在執行某個API函數的過程中,調用指定的一個函數(回調函數)。
比如:你有一個任務,但是有一部分你不會做,或者說不愿做,所以我來幫你做這部分,你做你其它的任務工作或者等著我的消息,但是當我完成的時候我要通知你我做好了,你可以用了,我怎么通知你呢?你給我一部手機,讓我做完后給你打電話,我就打給你了,你拿到我的成果加到你的工作中,繼續完成其它的工作.這就叫回叫,手機是我通知你的手段,它就是回叫函數,也叫回調函數(Callback Function)。
簡單說就是,由程序員編寫的,給windows系統(API)調用的函數。 也就是說,函數的功能有你定,調用有windows系統(API)調用。
回調函數就是通過函數的指針來調用的函數。對于一個傳遞給其他函數的參數,如果你傳遞的是一個函數的指針(也就是地址),當這個指針被用來調用這個函數時,就可以說是構造了一個回調函數。就是你把自定義函數地址給別人,別人調用你的函數。
回調函數,就是由你自己寫的。你需要調用另外一個函數,而這個函數的其中一個參數,就是你的這個回調函數名。這樣,系統在必要的時候,就會調用你寫的回調函數,這樣你就可以在回調函數里完成你要做的事。
1. 回調函數是由開發者按照一定的原型進行定義的函
2. 回調函數并不由開發者直接調用執行
3 .回調函數通常作為參數傳遞給系統API,由該API來調用。
4. 回調函數可能被系統API調用一次,也可能被循環調用多次。
回調函數主要用于一些比較費時的操作,或響應不知道何時將會發生的事件,回調函數提供了一種異步的機制,相對于同步執行,提高了效率.
前者的例子如WriteFileEx,ReadFileEx等,函數的***一個參數是一個回調函數的指針,程序中調用WriteFileEx以后,就直接返回了,可以繼續進行其他工作,系統在讀寫操作完成后通知程序作善后處理.后者的例子就是windows的事件機制回調函數的另一個用途,是用于一些枚舉函數,如EnumDisplayModes等,每找到一種支持的顯示模式,就通知回調函數,由回調函數具體處理,這是因為 EnumDisplayModes本身并不知道用戶要如何處理.能,用戶提供回調函數,定制系統的功能,這樣,不同的用戶提供不同的回調函數,可以使系統具有不同的功能.
這就是所謂的plugin.使用回調函數實際上就是在調用某個函數(通常是API函數)時,將自己的一個函數(這個函數為回調函數)的地址作為參數傳遞給那個函數。而那個函數在需要的時候,利用傳遞的地址調用回調函數,這時你可以利用這個機會在回調函數中處理消息或完成一定的操作。至于如何定義回調函數,跟具體使用的API函數有關,一般在幫助中有說明回調函數的參數和返回值等。
1。比如在內核編程中,驅動程序就要提供一些回調函數,當一個設備的數據讀寫完成后,讓系統調用這些回調函數來執行一些后續工作。
2。回調函數和其他函數沒什么區別,只是有固定的參數和調用約定,比如windows的回掉函數都要用stdcall. 參數是由調用這個回調函數的函數傳遞的,當然要規定好參數格式。使用很簡單,就是傳遞這個回調函數的地址給調用的函數作為一個參數。比如創建線程的時候就是這樣的 。
3。回調函數的使用主要在于windows原有的API函數,但對于用戶的自定義的調用函數一般在于動態連接庫中。常規的同一個工程下面一般不需要使用回調函數。(個人認為).。
使用回調函數需要注意的地方:
1、 定義一個回調函數類型,跟一般的函數過程的定義并沒有什么區別,但其定義必須根據需要滿足回調函數的函數要求,唯一的區別在于在函數或過程的定義后面必須聲明其為windows標準調用;
例:
對于函數的聲明:
type
- THDFunction= function(I:integer;s:string):integer; stdcall;
對于過程的聲明:
type
- THDProcedure=procedure(s:string); stdcall;
2、 然后根據此原形定義一個相應的函數或過程,對于這個函數或過程來說名字沒有什么要求,對函數其參數的類型和返回值的類型必須和定義的回調函數類型完全一致,對于過程來說,只需要其參數類型一樣就可以了。
例:根據上面的函數和過程的原形定義一個相應的函數和一個相應的過程。
函數原形定義:
- Function HdFunExample(k:integer,sExam:string):integer; stdcall;
過程定義:
- procedure HdProExample(sExam:string);stdcall;
3、 在程序中實現此回調函數或著過程;
- Function HdFunExample(k:integer,sExam:string):integer; stdcall;
- Begin
- End;
- procedure HdProExample(sExam:string);stdcall;
- begin
- end;
4、 調用過程;
回調函數一般作為系統的某個函數的入口地址;
根據調用函數的原形:
假設有如下調用函數:
- function DyHdFunExample(HdFun:THDFunction;I:integer):boolean;
注:
在調用函數中通過對函數指針的處理可以直接調用回調函數(即調用函數中的那個是回調函數類型的參數,直接操作它),使回調函數履行一定的操作。即在調用函數中實現回調函數的功能。
調用:
- var
- I:integer;
- begin
- I:=DyHdFunExample(@HdFunExample,i);
- //…….
- End;
【編輯推薦】