CALLBACK 学习1

如何实现自己的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应该是用类似函数来实现在一定情况下系统对回调函数的调用)

你可能感兴趣的:(CALLBACK 学习1)