windows - Windows API 函数声明中的 "CALLBACK"是什么意思?

标签 windows winapi

<分区>

Possible Duplicate:
What does a “CALLBACK” declaration in C do?

WindowProc()函数的原型(prototype)是这样的

LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam);

但是我从来没有遇到过CALLBACK关键字,我只知道回调函数是你传递一个指向另一个函数的指针,那么这里的CALLBACK到底是什么?它有什么作用?

最佳答案

#defined as __stdcall,因为这是 Win32 API 对回调函数的假设。这是一个调用约定——它描述了函数调用在底层的排列方式——参数在 CPU 堆栈上的排列方式,等等。关于预期堆栈布局(即调用约定)的假设必须在调用者和被调用者之间匹配,否则可能会发生各种有趣的后果。

从历史上看,在 Intel CPU 上有多个调用约定;如果算上非 Microsoft 编译器,则更多。如果您计算除 C[++] 之外的能够调用和被 Windows API 调用的语言,则更多。确保您的 Windows API 回调被显式标记为 __stdcall 以匹配 WinAPI 期望是一个很好的做法。在某些情况下,根据编译器和设置,__stdcall 是默认调用约定(即您可以安全地省略 CALLBACK),但并非总是如此。

在 Win16 中,CALLBACK 被定义为 far pascal。这更不可能成为用户函数的默认值,尤其是在 C 程序中。回调被假定为具有 Pascal 调用约定的事实是一个历史产物。它还可以作为微优化。

关于windows - Windows API 函数声明中的 "CALLBACK"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11066202/

相关文章:

java - 如何找出一个文件当前是否在 Java 中增长(独立于操作系统)

windows - Windows : unknown function vundle#begin 上的 Vim Vundle 安装

c++ - 带有 desktop.ini 和即时刷新的自定义文件夹图标

c++ - DISK PERFORMANCE 结构的 Read Time 和 WriteTime 成员

windows - 在运行时请求管理员权限

c++ - 如何使用 C++ 获取机器 ID

java - 作为后台进程运行 java 应用程序

ruby-on-rails - Make 未被识别为内部或外部命令

windows - 如何让输出显示在 Visual Studio 2005 错误列表的消息 Pane 中?

c++ - 无法使 SHGetKnownFolderPath() 函数正常工作