【醒目】菜鸟之疑惑——回调函数,80分是你的了

klk 2004-05-08 08:14:49
我对回调函数的机制搞得不太清楚,只知道windows编程时处理消息循环的函数WindowProc是个回调函数:
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);

我的问题是:
1.LRESULT、CALLBACK到底是什么typedef来的?

2.这里的CALLBACK是否就是回调函数的声明呢?没了CALLBACK是否就不能声明一个回调函数了呢?

3.请详述回调函数的工作机理。或者能否推荐一些参考书籍和资料?

4.回调函数的应用范围(除了上面这个例子,还有没有其他回调函数的应用?)

各位高手拜托啦,请大家集思广益、能者多劳,小弟我先谢过了!
...全文
109 13 点赞 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
klk 2004-05-09
谢谢大家!那个贴好长,改天慢慢看……

pjohnlei(lei):
CALLBACK是不是声明一个回调函数的必要条件呢?
还有cel call/std call/call back的具体区别在哪呢?
“需要程序在某种状态下让操作系统调用”:还是WindowProc函数的作用吗?如果是自定义的其它函数,怎么与winclass相关联呢?举个例子行吗?麻烦了。
  • 打赏
  • 举报
回复
freefalcon 2004-05-09
楼主舍不得看,那俺把代码转贴过来吧

typedef void (CALLBACK *FOO)(int other_value, unsigned long user_value); //定义函数指针类型,实际上制定了回调函数的接口

class A
{
public:
A(){};
void registerCallback(FOO foo, unsigned long user_value) //注册回调函数的方法
{
m_foo = foo;
m_user_value = user_value;
}

void test()
{
m_foo(0, m_user_value); //通过函数指针使用回调
}

private:
FOO m_foo; //回调函数指针
unsigned long m_user_value;
};

class B
{
public:
B(){}

static void CALLBACK foo(int other_value, unsigned long user_value) //用户程序实现回调接口
{
B* pthis = reinterpret_cast<B*>(user_value);
if(pthis)
{
pthis->test = 123;
}
}
private:
int test;
};

void main()
{
A aa;
B bb;
aa.registerCallback(B::foo, (unsigned long)&bb);
aa.test();
}

简单的说,回调函数就是A要用到B的模块,但B又要反过来调用A的函数,A的这个函数就叫回调函数。回调函数和普通的函数在本质上没有区别,不是前面所说的一定是系统来调用。
回调函数一般用在SDK的编写中,比如你要向其它用户提供一套下层开发包,你很可能需要和用户的程序进行交互,这时就会经常使用回调。
  • 打赏
  • 举报
回复
redguardtoo 2004-05-09
首先掌握函数指针的概念。

然后使用一下标准C库的qsort函数,学习一下回调的用处是什么。

其余的都很简单了,和操作系统没有什么关系。
  • 打赏
  • 举报
回复
pjohnlei 2004-05-09
是的声明一个回调函数必须申明为call back, call back 在windows 里调用的一种格式,就是告诉系统这个函数是给它调用的,具体的调用可以看看上面几位大虾推荐的书
  • 打赏
  • 举报
回复
cancer001 2004-05-09
对了,《windows程序设计》是两侧(第五版),看完了就不会再问这样的问题了!
  • 打赏
  • 举报
回复
cancer001 2004-05-09
给楼主推荐两本好书《windows程序设计》
  • 打赏
  • 举报
回复
izdlywn 2004-05-08
回调函数是由系统调用的

CALLBACK只是一种格式
  • 打赏
  • 举报
回复
klk 2004-05-08
cngdzhang() :
回调函数实际上是通过函数指针调用的
==================================
能否再说的详细一点?

iintsy(Dandy):
你写的,但是不能自己调用,而是通过系统来调用的函数,就是回调函数。
=================================================================
你说的系统指什么?windows? 操作系统?
如果自己调用了会有什么后果?
能不能再举个其它典型的回调函数例子?


还有,谁能回答一下2和4啊? 小弟实在驽钝,还请大家详细指点。
  • 打赏
  • 举报
回复
freefalcon 2004-05-08
上面说得差不多了
下面这个帖子中有关于回调的讨论,不止设计回调函数,还涉及回调类,要看完得有耐心哦,:)
http://expert.csdn.net/Expert/topic/3036/3036049.xml?temp=.4483911
  • 打赏
  • 举报
回复
pjohnlei 2004-05-08
回调函数是指由系统定义,调用但具体的实现由我们完成。完成我们所定义的功能,一般消息处理和需要程序在某种状态下让操作系统调用。call back是一种调用的约定,一般有cel call,和std call ,call back 就是std call就是标准的调用约定,vc默认是cel call 所以要加上call back 一方面是更改调用约定一方面是程序可读性强,别人一看就知道是回调函数.书可以看windows 编程 等
  • 打赏
  • 举报
回复
iintsy 2004-05-08
你写的,但是不能自己调用,而是通过系统来调用的函数,就是回调函数。
typedef LONG LRESULT;
#define CALLBACK __stdcall
  • 打赏
  • 举报
回复
munn 2004-05-08
就是你写函数别人调用
  • 打赏
  • 举报
回复
cngdzhang 2004-05-08
LRESULT 指明返回一个32位的无符号数,表明程序执行结果
CALLBACK 表明了函数的压栈顺序等等,一般用于回调函数

回调函数实际上是通过函数指针调用的,

MSDN 讲的挺详细的了
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-05-08 08:14
社区公告
暂无公告