c++ - “LRESULT CALLBACK WinProc”和“LRESULT WINAPI WinProc”之间的区别
问题描述
我正在学习使用 DirectX9 创建游戏,我发现定义 WinProc 的不同版本:
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
我不知道它们之间有什么不同,我应该使用什么版本?谢了兄弟。
解决方案
#define CALLBACK __stdcall
#define WINAPI __stdcall
从两者的宏观定义来看,它们是相同的。
MSDN:
CALLBACK、WINAPI 和 APIENTRY 都用于定义具有 __stdcall 调用约定的函数。Windows API 中的大多数函数都是使用 WINAPI 声明的。您可能希望将 CALLBACK 用于您实现的回调函数,以帮助将函数识别为回调函数。
什么是 Windows 调用约定?
来自MSDN:
名称的修饰方式取决于语言以及编译器如何被指示使函数可用,即调用约定。DLL 使用的 Windows 的标准进程间调用约定称为 WinAPI 约定。它在 Windows 头文件中定义为 WINAPI,而后者又使用 Win32 声明符 __stdcall 定义。
也就是说WINAPI、CALLBACK和_stdcall在Windows平台上是一样的。
您可以使用 CALLBACK 或 WINAPI。
推荐阅读
- tensorflow - 在 Firefox 中使用 web worker 训练 LSTM 不适用于 tensorfow js
- javascript - 如何将 CSV 文件的标题与 mongoDB 中的集合字段匹配
- json - 如何在以下 JSON 值中仅检索状态真或假
- jenkins - Jenkins 中是否有任何插件可以在作业构建后自动将 feature/dev 分支合并到 master?
- netcat - 如何将空字节发送到 netcat 服务器?
- javascript - 如何在悬停时设置 Bootstrap 下拉菜单?
- reactjs - 在 CI 管道上构建项目以及尝试通过 Yarn 添加包时出现错误“错误找不到包“XXX”
- python - 如果它们不在预选列表中,如何遍历图中的边
- c - Libcurl 将更改请求从 PUT 上传到 POST
- r - 如何通过传递字符向量重命名 tibble 中的所有列名?