回调函数
网上很多博客都有讲回调函数,但每当把代码放出来,我都会疑问——为什么不能直接调用,非要用指针间接调用呢?
后来才知道,调用回调函数的主调函数是已经封装好的,即已经编译无法修改源代码的。所以以防误导,不应该用代码的形式讲解,否则越讲越很乱…
借用一句话简明扼要阐述回调函数的产生背景,“你想让别人的代码执行你的代码,而别人的代码你又不能动”。所以你要用别人的函数通过指针的形式间接调用你的函数,即回调函数。
回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。