关于回调函数

jerrymousenet2 2002-07-28 11:47:38
近几天,我对回调函数的定义及用法感到困惑,请各位给俺解解迷团?

回调函数的定义如下:是我查来的,真正的含义和用法不太明白。

所谓回调函数就是DLL可以调用其他应用程序或另一个DLL的函数.

回调函数就是能对一系列系统内部元素执行给定操作的API函数

普通函数是自己写自己调用,如果函数是自己写,由别人(操作系统)来调用,这个函数就叫回调函数
还有很多定义呢,我想知道它存在的意义所在。
另外回调函数的声明和普通函数是否有区别,

...全文
160 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
回调 原文CALLBACK。

简单来说,当你调用一个函数包含如下的入口参数时,

fun(MYFUN* fun1,.....)的时候,我们就可以将函数指针fun1叫做回调函数。

这么叫的原因也很简单。你调用fun的时候,fun又回过来调用了fun1。故称fun1为回调函数。

所以回调函数只是一个函数指针,她有主调函数在用户调用时自动调用。
mygodness 2002-07-29
  • 打赏
  • 举报
回复
首先,回调函数是函数的一种,都有一样的声明和定义格式。
其次,回调函数是其他函数中的参数。也就是说其函数地址作为其他函数的参数。
我是这样理解的。
回调函数不同的地方有不同的使用方法,一般很少用到,API里常用。

jerrymousenet2 2002-07-29
  • 打赏
  • 举报
回复
首先谢谢以上各位了。但是我见过的一些回调函数有些是没有CALLBACK这个关键字的。
coolpony 2002-07-29
  • 打赏
  • 举报
回复
cker兄你说的我这样的菜鸟都懂了。。
先谢过了。。
781014 2002-07-29
  • 打赏
  • 举报
回复
钛哥 2002-07-29
  • 打赏
  • 举报
回复
好像你上面说得的功能都能用一般的函数调用来实现,大不了定义一个函数指针,或者一个远函数,他到底有那些功能是非他不可的?
jerrymousenet2 2002-07-29
  • 打赏
  • 举报
回复
她由主调函数在用户调用时自动调用,这句话有些不太明白,是不是指在主调函数的内部会调用到这个指针函数呢,
另外对上面所给的范例我的一些困惑如下:
1,CALLBACK:这个关键字是不是一定要呢?可以省略吗?
2,EnumChildWindows你指的这个回调函数用普通函数不是也可以做到吗?


goldolphin 2002-07-29
  • 打赏
  • 举报
回复
可以用于事件通知,如定时器,多媒体操作。
magicsnake 2002-07-29
  • 打赏
  • 举报
回复
mark:)
jishiping 2002-07-29
  • 打赏
  • 举报
回复
同意 cker(〖烟波浩淼三千里、人鬼殊途五百年〗) 的说法。
你需要先写好一个函数(就是上面cker说的fun1),然后你调用函数fun时,
需要将函数名fun1作为fun的参数,在函数fun的内部,会调用函数fun1。
IT-司马青衫 2002-07-29
  • 打赏
  • 举报
回复
我也不很懂
不对,消息处理函数不是回调函数,不过第一句话是对的--"就是你写的函数让系统来调用"。
回调函数与类的虚拟方法差不多。
一般地,调用回调函数的是管理函数,被调用的回调函数进行具体的事务处理。
比如说,我编写一个遍历磁盘文件的函数,可以把指定路径下的所有文件都枚举出来,并
对每一个文件进行处理,但对文件的具体处理可能是多种多样的,得由这个文件遍历函数
的调用者来确定,所以,我就设置了一个函数参数,由调用者在调用时提供,每当我找到
一个文件就调用这个参数所指定的函数。于是,当你需要对每个文件进行处理时,就编写
一个对文件进行具体处理的函数(回调函数),将其作为参数调用文件遍历函数,而者结
合,就完成了遍历并处理文件的功能。
这样做的好处是,管理函数是通用的,你也不用关心管理上的实现细节

怎样理解回调函数?请用EnumDateFormats,EnumDateFormatsProc简单说明一下!
HI.这边有篇文章可以看看:

Question: How can I know exactly how many windows are open?
Answer: You can use EnumWindows and EnumChildWindows to do this. The
following code sample will illistrate how to do this.


/*****************************************************************************



* BOOL EnumWindows(
* WNDENUMPROC lpEnumFunc, // pointer to callback function
* LPARAM lParam // application-defined value
* );


*
* ->Parameters
*
* -->lpEnumFunc
* Points to an application-defined callback function. For more information,
* see the EnumWindowsProc callback function.
*
* -->lParam
* Specifies a 32-bit, application-defined value to be passed to the callback
* function.
*
* BOOL EnumChildWindows(
* HWND hWndParent, // handle to parent window
* WNDENUMPROC lpEnumFunc, // pointer to callback function
* LPARAM lParam // application-defined value
* );
*
* ->Parameters
*
* -->hWndParent
* Identifies the parent window whose child windows are to be enumerated.
*
* -->lpEnumFunc
* Points to an application-defined callback function. For more information
* about the callback function, see the EnumChildProc callback function.
*
* -->lParam
* Specifies a 32-bit, application-defined value to be passed to the callback
* function.
*******************************************************************************/

#include"iostream"
#include "conio.h"
#include "winuser.h"
#pragma hdrstop
#include "condefs.h"
//---------------------------------------------------------------------------

#pragma argsused
using namespace std;
int iWindows = 0;

BOOL CALLBACK EnumChildWinProc (HWND hwnd, LPARAM lParam)
{
iWindows++;
return true;
}


BOOL CALLBACK EnumWinProc (HWND hwnd, LPARAM lParam)
{
iWindows++;
EnumChildWindows (hwnd, EnumChildWinProc, 0);
return true;
}



int main(int argc, char* argv[])
{
EnumWindows(EnumWinProc, 0);
cout << "Current Number of Windows: " << iWindows << endl;
getch ();
return 0;
}



一样啊。
申明一个回调函数。然后去CALL他。。
比如:


BOOL CALLBACK EnumWinProc (HWND hwnd, LPARAM lParam)
{
iWindows++;
// EnumChildWindows (hwnd, EnumChildWinProc, 0);
return true;
}



void __fastcall Button1Click(TObject *Sender)
{
EnumWindow((WNDENUMPROC)EnumWinProc,0);
}

huzhangyou 2002-07-29
  • 打赏
  • 举报
回复
learning.....................................
jishiping 2002-07-29
  • 打赏
  • 举报
回复
其实CALLBACK的定义和WINAPI是一样的,这就如同HBRUSH HPEN都是一个指针
而已,用不同的名字,只是让人一样就知道它是什么类型的。回调函数和一
般的函数,没有什么本质的区别。说是回调函数,仅仅是说,它是作为其它
函数的一个参数,这个函数体内部会调用这个回调函数。在回调函数的定义
中,CALLBACK还是一定要的,不要了,函数的描述符不一样,可能就会有问
题了。
钛哥 2002-07-29
  • 打赏
  • 举报
回复
#ifdef _MAC
#define CALLBACK PASCAL
#define WINAPI CDECL
#define WINAPIV CDECL
#define APIENTRY WINAPI
#define APIPRIVATE CDECL
#ifdef _68K_
#define PASCAL __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY WINAPI
#define APIPRIVATE
#define PASCAL pascal
#endif

以上是windef.h中对CALLBACK的定义。
看来在 _MSC_VER >= 800 或 defined(_STDCALL_SUPPORTED)
跟 __stdcall 一样
如果在mac 机下,就是pascal调用,
好处大概是代码便于移植。不知说的对不对?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧