__stdcall - WINAPI vs STDMETHODCALLTYPE vs APIENTRY

__stdcall - WINAPI vs STDMETHODCALLTYPE vs APIENTRY

本文关键字:vs APIENTRY STDMETHODCALLTYPE WINAPI stdcall      更新时间:2023-10-16

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

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

WINAPISTDMETHODCALLTYPE都扩展到同一件事:x86__stdcall,其他所有内容都没有。那么为什么同一件事有 2 个别名呢?因为它们控制不同子集的调用约定:

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

COM 和 Windows API 是独立的。有 2 个别名来控制其中任何一个的调用约定是完全有意义的。你不希望中断所有 COM,只是因为你要移动到 Win128 的新 ABI。

因为在 16 位中,所有这些都是不同的约定。从 x86 平面模式开始,所有与窗口相关的内容都__stdcall(从右向左推,被调用方清除堆栈(。__cdecl__fastcall也存在。

自 x64 以来,实际上只有一个,所有这些都被忽略了。

许多其他Windows元素也是如此,如WPARAM和LPARAM。一旦 WPARAM 是 16 位,在 x86 中它们都是 32 位,在 x64 中它们都是 64 位。