__stdcall - WINAPI vs STDMETHODCALLTYPE vs APIENTRY

SAS*_*QUA 3 c++ winapi

我正在阅读一些处理内存操作以修复游戏“问题”的游戏修复代码。我发现代码使用了 2 个,分别是WINAPISTDMETHODCALLTYPE。这些宏都被评估为__stdcall指定函数的调用约定。我还发现这APIENTRY也是WINAPI. 那么这些宏之间有什么区别吗?在我看来,它们只是别名。为什么有这么多?

IIn*_*ble 5

Windows API 中的所有数据类型和调用约定都定义为别名(预处理器宏或typedefs)。这允许稳定的 ABI,而与编译器或工具链无关。它还允许在不破坏现有代码的情况下更改 ABI(例如,当引入 64 位 Windows 时)。

双方WINAPISTDMETHODCALLTYPE扩大到同一件事:__stdcall为x86和没有的一切。那么为什么同一件事有 2 个别名呢?因为它们控制不同子集的调用约定:

  • WINAPI 指定基于平面 C 的 Windows API 的调用约定。
  • STDMETHODCALLTYPE,另一方面,控制 COM(组件对象模型)的调用约定。

COM 和 Windows API 是独立的。有 2 个别名来控制任何一个的调用约定都是非常有意义的。您不想破坏所有 COM,仅仅因为您要迁移到适用于 Win128 的新 ABI。