WindowProc()函数的原型是这个
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);
但是我从未遇到过CALLBACK关键字,我只知道回调函数是一个将指针传递给另一个函数的函数,那么这个CALLBACK到底是什么?它做了什么?
答案 0 :(得分:8)
它的#defined为__stdcall
,因为这就是Win32 API对回调函数的假设。这是一个调用约定 - 它描述了函数调用在低级别上的排列方式 - 如何在CPU堆栈上排列参数等等。关于预期的堆栈布局(即约定)的假设必须在呼叫者和被呼叫者之间匹配,否则可能产生各种有趣的后果。
历史上,在Intel CPU上有多种约定;如果计算非Microsoft编译器,则会更多。确保你的回调是__stdcall是一个很好的做法。在某些情况下,根据编译器和设置,__ stdcall是默认的调用约定(即,您可以安全地省略CALLBACK),但并非总是如此。
回到Win16,CALLBACK被定义为far pascal
。这甚至不太可能成为用户功能的默认设置,尤其是在C程序中。假设回调被认为具有Pascal调用约定这一事实是一个历史人工制品。