• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            twzheng's cppblog

            『站在風口浪尖緊握住鼠標旋轉!』 http://www.cnblogs.com/twzheng

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評論 :: 0 Trackbacks

            程序中碰到一個關于回調函數的錯,始終沒能解決。。。查閱很多資料,對回調函數眾說紛紜,收集如下,加深對回調函數的理解。

            回調函數(Callback  Function)

            什么是回調函數?

                回調函數是應用程序提供給Windows系統(tǒng)DLL或其它DLL調用的函數,一般用于截獲消息、獲取系統(tǒng)信息或處理異步事件。應用程序把回調函數的地址指針告訴DLL,而DLL在適當的時候會調用該函數。回調函數必須遵守事先規(guī)定好的參數格式和傳遞方式,否則DLL一調用它就會引起程序或系統(tǒng)的崩潰。通常情況下,回調函數采用標準WindowsAPI的調用方式,即__stdcall,當然,DLL編制者可以自已定義調用方式,但客戶程序也必須遵守相同的規(guī)定。在__stdcall方式下,函數的參數按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數都按值傳遞,函數返回之前自己負責把參數從堆棧中彈出。



            理解回調函數!

            程序在調用一個函數(function)時(通常指api).相當于程序(program)呼叫(Call)了一個函數(function)關系表示如下:
                            call(調用)
               program  --------------------→    dll

            程序在調用一個函數時,將自己的函數的地址作為參數傳遞給程序調用的函數時(那么這個自己的函數稱回調函數).需要回調函數的 DLL 函數往往是一些必須重復執(zhí)行某些操作的函數.關系表示如下:

                           call(調用)
               program  --------------------→    dll
                  ↑                               ¦
                  ¦_______________________________¦
                          callback(回調)

            當你調用的函數在傳遞返回值給回調函數時,你就可以利用回調函數來處理或完成一定的操作。至于如何定義自己的回調函數,跟具體使用的API函數有關,很多不同類別的回調函數有各種各樣的參數,有關這些參數的描述一般在幫助中有說明回調函數的參數和返回值等.其實簡單說回調函數就是你所寫的函數滿足一定條件后,被DLL調用!

            也有這樣的說法(比較容易理解):
               回調函數就好像是一個中斷處理函數,系統(tǒng)在符合你設定的條件時自動調用。為此,你需要做三件事:
            1. 聲明;
            2. 定義;
            3. 設置觸發(fā)條件,就是在你的函數中把你的回調函數名稱轉化為地址作為一個參數,以便于DLL調用。

            簡化理解回調函數- -

                                                  

            回調函數還真有點像您隨身帶的BP機:告訴別人號碼,在它有事情時Call您回調用于層間協(xié)作,上層將本層函數安裝在下層,這個函數就是回調,而下層在一定條件下觸發(fā)回調,例如作為一個驅動,是一個底層,他在收到一個數據時,除了完成本層的處理工作外,還將進行回調,將這個數據交給上層應用層來做進一步處理,這在分層的數據通信中很普遍。
            其實回調和API非常接近,他們的共性都是跨層調用的函數。但區(qū)別是API是低層提供給高層的調用,一般這個函數對高層都是已知的;而回調正好相反,他是高層提供給底層的調用,對于低層他是未知的,必須由高層進行安裝,這個安裝函數其實就是一個低層提供的API,安裝后低層不知道這個回調的名字,但它通過一個函數指針來保存這個回調,在需要調用時,只需引用這個函數指針和相關的參數指針。
            其實:回調就是該函數寫在高層,低層通過一個函數指針保存這個函數,在某個事件的觸發(fā)下,低層通過該函數指針調用高層那個函數



            什么是回調函數?如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。//回調比較函數   if(1 == (*cmpFunc)(array+j*elem_size,array+(j+1)*elem_size))   {    //兩個相比較的元素相交換    byte* temp = new byte[elem_size];    memcpy(temp, array+j*elem_size, elem_size);    memcpy(array+j*elem_size,array+(j+1)*elem_size,elem_size);    memcpy(array+(j+1)*elem_size, temp, elem_size);    delete [] temp;   }  }


            剛找到一篇關于回調函數很不錯的文章,收藏在我的文章分類里了:

            C/C++中回調函數初探







                    
            posted on 2007-05-21 16:41 譚文政 閱讀(1887) 評論(0)  編輯 收藏 引用 所屬分類: 基礎知識網絡編程
            99久久香蕉国产线看观香| 精品无码久久久久久久久久| 无码任你躁久久久久久久| 久久精品国产亚洲一区二区三区| 久久一本综合| 久久精品无码专区免费东京热| 国产精品gz久久久| 久久精品成人欧美大片| 欧美久久精品一级c片片| 色综合久久久久综合99| 91精品国产综合久久精品| 久久婷婷五月综合色99啪ak| 99久久99这里只有免费费精品| 久久久WWW成人免费毛片| 久久超乳爆乳中文字幕| 日产久久强奸免费的看| 青青国产成人久久91网| 国产美女亚洲精品久久久综合| 久久高清一级毛片| 久久国产精品久久精品国产| 狠狠色丁香久久婷婷综合_中| 亚洲精品国产成人99久久| 久久综合久久自在自线精品自| 色偷偷91久久综合噜噜噜噜| 青青草国产成人久久91网| 国产V综合V亚洲欧美久久| 亚洲午夜久久久久久久久久| 亚洲精品无码久久久| 精品无码久久久久久国产| 青青草原1769久久免费播放| av无码久久久久不卡免费网站 | 精品水蜜桃久久久久久久| 国产精品久久国产精麻豆99网站| 久久亚洲精品无码VA大香大香| 久久国产精品无| 亚洲色欲久久久久综合网| 日本国产精品久久| 久久成人国产精品免费软件| 亚洲午夜福利精品久久| 久久天天躁夜夜躁狠狠| 久久伊人五月丁香狠狠色|