成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

回調函數以及鉤子函數的概念

開發 開發工具
下面這篇文章寫回調函數的概念還是比較清晰的,回調函數就是自己寫的一個函數,但是不能被顯式的調用。希望對你有幫助,一起來看。

鉤子實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。

對每種類型的鉤子由系統來維護一個鉤子鏈,最近安裝的鉤子放在鏈的開始,而***安裝的鉤子放在***,也就是后加入的先獲得控制權。要實現Win32的系統鉤子,必須調用SDK中的API函數SetWindowsHookEx來安裝這個鉤子函數,這個函數的原型是HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);其中,***個參數是鉤子的類型;第二個參數是鉤子函數的地址;第三個參數是包含鉤子函數的模塊句柄;第四個參數指定監視的線程。

如果指定確定的線程,即為線程專用鉤子;如果指定為空,即為全局鉤子。其中,全局鉤子函數必須包含在DLL(動態鏈接庫)中,而線程專用鉤子還可以包含在可執行文件中。得到控制權的鉤子函數在完成對消息的處理后,如果想要該消息繼續傳遞,那么它必須調用另外一個SDK中的API函數CallNextHookEx來傳遞它。鉤子函數也可以通過直接返回TRUE來丟棄該消息,并阻止該消息的傳遞。

下面這篇文章寫回調函數的概念還是比較清晰的,回調函數就是自己寫的一個函數,但是不能被顯式的調用,而是把該函數的地址作為一個別的函數參數來引用,這樣用來處理當一些事件發生時可以調用這個自己定義的回調函數,完成一些處理。

回調函數大多只是自己定義一個名字而已,函數體大多是系統定義好的,它有一個結構,一般一個代回調函數的的函數都有一個參數是接你的回調名的,它把一些值傳進回調函數(函數體包括參數是它預定好的,不能自己寫,除非全部函數都是你寫的),然后回調函數接受值,相應操作后將值返回到原函數體(它的父親函數),最終讓原函數返回一個值

我們經常在 C++ 設計時通過使用回調函數可以使有些應用(如定時器事件回調處理、用回調函數記錄某操作進度等)變得非常方便和符合邏輯,那么它的內在機制如何呢,怎么定義呢 ? 它和其它函數(比如鉤子函數)有何不同呢?這里結合自己的使用經歷做一個簡單的介紹。

使用回調函數實際上就是在調用某個函數(通常是 API 函數)時,將自己的一個函數(這個函數為回調函數)的地址作為參數傳遞給那個函數。而那個函數在需要的時候,利用傳遞的地址調用回調函數,這時你可以利用這個機會在回調函數中處理消息或完成一定的操作。至于如何定義回調函數,跟具體使用的 API 函數有關,一般在幫助中有說明回調函數的參數和返回值等。 C++ 中一般要求在回調函數前加 CALLBACK (相當于 FAR PASCAL ),這主要是說明該函數的調用方式。

至于鉤子函數,只是回調函數的一個特例。習慣上把與 SetWindowsHookEx 函數一起使用的回調函數稱為鉤子函數。也有人把利用 VirtualQueryEx 安裝的函數稱為鉤子函數,不過這種叫法不太流行。

也可以這樣,更容易理解:回調函數就好像是一個中斷處理函數,系統在符合你設定的條件時自動調用。為此,你需要做三件事:

1. 聲明;

2. 定義;

3. 設置觸發條件,就是在你的函數中把你的回調函數名稱轉化為地址作為一個參數,以便于系統調用。

聲明和定義時應注意:回調函數由系統調用,所以可以認為它屬于 WINDOWS 系統,不要把它當作你的某個類的成員函數

回調函數 是一個程序員不能顯式調用的函數;通過將回調函數 的地址傳給調用者從而實現調用。回調函數 使用是必要的,在我們想通過一個統一接口實現不同的內容,這時用回掉函數非常合適。

比如,我們為幾個不同的設備分別寫了不同的顯示函數:

void TVshow(); void ComputerShow(); void NoteBookShow()...等等。

這是我們想用一個統一的顯示函數,我們這時就可以用回掉函數了。void show(void (*ptr)()); 使用時根據所傳入的參數不同而調用不同的回調函數 。

不同的編程語言可能有不同的語法,下面舉一個c語言中回調函數 的例子,其中一個回調函數 不帶參數,另一個回調函數 帶參數。

例子1:

 

  1. //Test.c   
  2. #include <stdlib.h>  
  3. #include <stdio.h>   
  4. int Test1()  
  5. {  
  6. int i;  
  7. for (i=0; i<30; i++)  
  8. {  
  9. printf("The %d th charactor is: %c\n", i, (char)('a' + i%26));  
  10. }  
  11. return 0;  
  12. }  
  13. int Test2(int num)  
  14. {  
  15. int i;  
  16. for (i=0; i<num; i++)  
  17. {  
  18. printf("The %d th charactor is: %c\n", i, (char)('a' + i%26));  
  19. }  
  20. return 0;  
  21. }   
  22. void Caller1(void (*ptr)())//指向函數的指針作函數參數  
  23. {  
  24. (*ptr)();  
  25. }  
  26. void Caller2(int n, int (*ptr)())//指向函數的指針作函數參數,這里***個參數是為指向函數的指針服務的,   
  27. //不能寫成void Caller2(int (*ptr)(int n)),這樣的定義語法錯誤。  
  28. (*ptr)(n);  
  29. return;  
  30. }  
  31. int main()  
  32. {   
  33. printf("************************\n");  
  34. Caller1(Test1); //相當于調用Test2();  
  35. printf("&&&&&&************************\n");  
  36. Caller2(30, Test2); //相當于調用Test2(30);  
  37. return 0;  

 

以上通過將回調函數 的地址傳給調用者從而實現調用,但是需要注意的是帶參回調函數 的用法。要實現回調,必須首先定義函數指針。函數指針的定義這里稍微提一下。比如:

int (*ptr)(); 這里ptr是一個函數指針,其中(*ptr)的括號不能省略,因為括號的優先級高于星號,那樣就成了一個返回類型為整型的函數聲明了。

【編輯推薦】

  1. 更多了解你的網站和用戶 談網站數據分析
  2. J2EE初學者要理解的幾個問題
  3. 教你分析一個網站做個哪些關鍵詞
  4. 3種類型的測試專家之路選擇
  5. 軟件測試面試題目及解答
責任編輯:于鐵 來源: 天山腳下
相關推薦

2023-06-19 08:23:28

kubernetes容器

2024-11-07 12:47:51

hook函數git

2025-03-06 03:00:00

hook??復數函數

2021-05-24 11:55:55

網絡安全Windows鉤子函數

2012-02-01 10:33:59

Java

2023-11-10 16:31:31

2011-06-15 11:05:14

C語言回調函數

2020-12-01 12:44:44

PythonHook鉤子函數

2025-02-04 10:00:30

Spring支付系統

2019-11-05 10:03:08

callback回調函數javascript

2022-04-12 08:30:52

回調函數代碼調試

2011-07-25 14:32:40

Cocoa 框架 函數

2009-08-12 10:11:18

C# 回調函數

2011-05-20 17:19:25

回調函數

2021-01-14 07:52:24

JavaScript回調函數

2022-04-18 08:34:29

回調函數命令解析

2023-04-18 08:10:10

2022-03-08 11:17:54

函數指針回調函數C語言

2009-08-19 17:10:09

C#回調函數

2009-11-04 11:32:20

VB.NET回調函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 自拍视频在线观看 | 欧美一区二区三区视频在线 | 日韩一区中文字幕 | 国产91在线 | 亚洲 | 国产精品精品久久久 | 欧美精品中文字幕久久二区 | 国产中文视频 | av免费网址 | 久久国产精彩视频 | 国产精品女人久久久 | 日日操网站 | 国产aⅴ爽av久久久久久久 | 欧美www在线 | 国产色网 | 天天摸天天干 | 日韩精品一区二区三区在线观看 | 国产一二三区在线 | 国产精品视频在线观看 | 成人在线播放网址 | 亚洲va欧美va天堂v国产综合 | 一区二区三区在线 | 国产www.| 国产精品免费一区二区 | 成人av一区二区三区 | 亚洲aⅴ | 一区二区日本 | 国产羞羞视频在线观看 | 第一区在线观看免费国语入口 | 成人av鲁丝片一区二区小说 | 不卡一区二区三区四区 | 久久免费精品 | 亚洲精品第一国产综合野 | 婷婷毛片 | 亚洲成人精品免费 | 成人在线网址 | 性生生活大片免费看视频 | 国产精品久久久久久久模特 | 亚洲视频一区二区三区 | 欧美大片在线观看 | 国产精品久久久久久婷婷天堂 | 最新国产精品精品视频 |