• <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

            『站在風(fēng)口浪尖緊握住鼠標(biāo)旋轉(zhuǎn)!』 http://www.cnblogs.com/twzheng

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評(píng)論 :: 0 Trackbacks

            程序中碰到一個(gè)關(guān)于回調(diào)函數(shù)的錯(cuò),始終沒能解決。。。查閱很多資料,對(duì)回調(diào)函數(shù)眾說紛紜,收集如下,加深對(duì)回調(diào)函數(shù)的理解。

            回調(diào)函數(shù)(Callback  Function)

            什么是回調(diào)函數(shù)?

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



            理解回調(diào)函數(shù)!

            程序在調(diào)用一個(gè)函數(shù)(function)時(shí)(通常指api).相當(dāng)于程序(program)呼叫(Call)了一個(gè)函數(shù)(function)關(guān)系表示如下:
                            call(調(diào)用)
               program  --------------------→    dll

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

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

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

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

            簡(jiǎn)化理解回調(diào)函數(shù)- -

                                                  

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



            什么是回調(diào)函數(shù)?如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)。//回調(diào)比較函數(shù)   if(1 == (*cmpFunc)(array+j*elem_size,array+(j+1)*elem_size))   {    //兩個(gè)相比較的元素相交換    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;   }  }


            剛找到一篇關(guān)于回調(diào)函數(shù)很不錯(cuò)的文章,收藏在我的文章分類里了:

            C/C++中回調(diào)函數(shù)初探







                    
            posted on 2007-05-21 16:41 譚文政 閱讀(1882) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 基礎(chǔ)知識(shí)網(wǎng)絡(luò)編程
            欧美精品一区二区久久| 亚洲国产精品一区二区久久| 久久无码精品一区二区三区| 伊人 久久 精品| 久久狠狠高潮亚洲精品| 精品久久人人做人人爽综合| 久久夜色精品国产亚洲av| 久久精品国产久精国产果冻传媒| 久久亚洲AV成人出白浆无码国产 | 一本一本久久aa综合精品| AV无码久久久久不卡蜜桃| 久久精品综合一区二区三区| 97精品国产97久久久久久免费| 97久久超碰国产精品旧版| 久久久久久国产a免费观看黄色大片| 人妻无码αv中文字幕久久| 久久精品国产色蜜蜜麻豆| 欧美va久久久噜噜噜久久| 久久国产成人午夜AV影院| 国产精品久久久久9999高清| 久久精品中文字幕大胸| 久久精品成人免费观看97| 99精品久久精品| 久久国产乱子伦免费精品| 久久亚洲日韩看片无码| 人妻无码久久精品| 国产日韩久久久精品影院首页| 久久久久亚洲av无码专区导航| 一本色道久久综合狠狠躁篇| 国内精品久久久久国产盗摄| 国产精品免费福利久久| 久久精品水蜜桃av综合天堂| 亚洲综合伊人久久综合| 97精品依人久久久大香线蕉97| 性做久久久久久免费观看| 久久无码精品一区二区三区| 精品人妻伦九区久久AAA片69 | 欧美久久天天综合香蕉伊| 91精品国产色综久久| 亚洲伊人久久大香线蕉苏妲己| 青青草国产成人久久91网|