CALLBACK函数的一些知识

原创 2007年09月23日 01:41:00

如何实现自己的CALLBACK函数,系统如何知道何时调用CALLBACK函数?

下面是摘自MSDN对CALLBACK的介绍:

CALLBACK:Calling convention for callback functions.

This type is declared in WinDef.h as follows:

#define CALLBACK __stdcall

The __stdcall calling convention is used to call Win32 API functions.

这说明回调函数可以不用CALLBACK修饰,CALLBACK只不过是一种calling convention,用来说明一个函数是Windows
API函数。

下面看一段代码:
typedef int func(int);  
typedef func* pfunc;  
   
  void Func(pfunc a)  
  {  
        for(int i=0;i<100;i++)  
            (*a)(a);  
  }  
  int callbackproc(int b)   //   相当于WINDOWS中的“callback函数”  
  {  
        printf("%d/n",b);  
  }  
  main()  
  {  
      Func(callbackproc);  
  }  

这是一个调用函数指针(不是回调函数)的例子,系统调用回调函数其实也是通过函数指针,那这两个又有什么不同
呢?

1、回调函数本质上也是函数指针,可以将它看作函数指针的一种应用。
2、CALLBACK常用于说明本函数是用于窗口处理过程或者对话框处理过程的,而函数指针是指向一个普通的用户函数而   已。
3、我们所说的回调函数一般只限于在Windows程序设计中使用。因为CALLBACK代表了一个Windows API函数,而函数
   指针就没有这种限制。
4、CALLBACK要等着系统来调用它,你不能使用它,是被动型的。而函数指针,是主动型的,你可以随时调用它。上面
   例子就是在Func函数中主动调用函数指针。
5、在实现上不同。回调函数只需要实现其功能,而它的函数原型已经由MICROSOFT定义好了,你不能随意改变。例如:
   SetTimer的回调函数就必须遵循下面的形式(主要是函数参数,函数名称可以改变,CALLBACK也可以不要):
   void CALLBACK EXPORT TimerProc(
   HWND hWnd,      // handle of CWnd that called SetTimer
   UINT nMsg,      // WM_TIMER
   UINT nIDEvent   // timer identification
   DWORD dwTime    // system time
);

但你必须确保把回调函数TimerProc的地址正确传给SetTimer函数,同时还必须将一个触发条件一起传给SetTimer函数
而SetTimer已经实现好拉,你不用再理会它的实现。而使用函数指针作为另一个函数参数,你需要实现两个函数,像上面的Func和callbackproc,都需要实现。(系统没有帮你实现Func函数,这与回调函数不同,在WINDOWS中,作为回调函数地址的接收者,像EnumWindows和SetTimer等,它们已经由系统实现拉,你只需要传入参数并调用就可以拉)

回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。

设置触发条件的一些方法:直接参数传入,像SetTimer,还有一些用函数来设置。
实现触发条件的一些函数:CreateWaitableTimer,WaitForSingleObject,WM_TIMER,Sleep等。(SetTimer应该是用类似函数来实现在一定情况下系统对回调函数的调用)

Platform invoke callback 

什么是回调函数Callback----自己的一点理解

何为回调函数:若把函数的指针作为函数参数传递给一个函数,当这个指着被用来调用它所指向的函数时,我们将该指针所指向的函数称为**回调函数**。回调函数与普通函数最大区别在于函数的调用。对普通函数而言,函...
  • Andoubi
  • Andoubi
  • 2016年08月03日 14:45
  • 1591

Callback函数详解

2010年的最后一天了,转载一篇自己认为还不错的文章与大家分享。希望对大家有所帮助。 一,回调函数我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等...
  • yiruirui0507
  • yiruirui0507
  • 2010年12月31日 22:18
  • 21972

Callback机制_基础(1)

No0:callback应用场景 虽然经过一段时间对android源码的研究,初步理解如何从app将参数设置到Linux kernel(高通camera部分),但对上层如何获得底层数据困惑不已,最近...
  • liwei16611
  • liwei16611
  • 2016年04月05日 11:55
  • 859

CALLBACK回调函数使用之一

凡是由你设计却由windows系统呼叫的函数,统称为callback函数。某些API函数要求以callback作为你参数之一。如SetTimer,LineDDA,EnumObjects。回调函数是由开...
  • phlexii
  • phlexii
  • 2006年05月12日 14:46
  • 33930

自定义jQuery 跨域请求 callback 函数名

项目中关于ajax jsonp的使用, 出现了问题:可以成功获得请求结果,但没有执行success方法 总算搞定了,记录一下  function TestAjax()  {     $....
  • longxingzhiwen
  • longxingzhiwen
  • 2017年02月18日 10:57
  • 3765

CALLBACK回调函数使用之三

大家都知道对象是数据和方法的封装体。在C++中,它们分别表现为数据成员和成员函数。程序设计者通过执行对象的各种方法,来改变对象的状态(即改变对象的属性数据)。从而使该对象发生某些“事件”。当一对象发生...
  • phlexii
  • phlexii
  • 2006年05月12日 15:23
  • 3992

回调函数

在了解回调函数之前,你应该先去了解函数指针!!! 先看一个回调函数的例子: #include #include void Call(void (*fp)(int) ,int x) //Cal...
  • gateway6143
  • gateway6143
  • 2014年06月09日 20:34
  • 683

Ajax异步回调函数(callback)

ajax请求确实是异步的,不过这请求是由浏览器新开一个线程请求,当请求的状态变更时,如果先前已设置回调,这异步线程就产生状态变更事件放到 JavaScript引擎的处理队列中等待处理。见:http:/...
  • limuzi13
  • limuzi13
  • 2016年12月14日 11:50
  • 13365

VC++中,如何定义callback函数和它的触发事件?

对于回调函数的编写始终是写特殊处理功能程序时用到的技巧之一。先介绍一下回调的使用基本方法与原理。 1、在这里设:回调函数为A()(这是最简单的情况,不带参数,但我们应用的实际情况常常很会复杂),...
  • q610098308
  • q610098308
  • 2016年04月01日 12:11
  • 1223

C/C++中Windows API 简单的(Callback)回调机制

C/C++中Windows API 简单的(Callback)回调机制
  • qq78442761
  • qq78442761
  • 2017年07月01日 10:55
  • 2597
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CALLBACK函数的一些知识
举报原因:
原因补充:

(最多只允许输入30个字)