C++ __stdcall-WINAPI vs STDMETHODCALLTYPE vs apitery

C++ __stdcall-WINAPI vs STDMETHODCALLTYPE vs apitery,c++,winapi,C++,Winapi,我正在阅读一些游戏修复代码,这些代码处理内存操作来修复游戏的“问题”。我发现代码使用了两个宏,分别是WINAPI和STDMETHODCALLTYPE。这些宏都被计算到指定函数调用约定的\uu stdcall中。我还发现apitery也是WINAPI的另一个宏别名。那么这些宏之间有什么区别吗?在我看来,它们只是化名。为什么会有这么多呢?因为在16位时,所有这些都是不同的约定。自x86平面模式以来,所有与windows相关的内容都是\uu stdcall(从右向左推,被调用方清除堆栈)\uuuCDE

我正在阅读一些游戏修复代码,这些代码处理内存操作来修复游戏的“问题”。我发现代码使用了两个宏,分别是
WINAPI
STDMETHODCALLTYPE
。这些宏都被计算到指定函数调用约定的
\uu stdcall
中。我还发现
apitery
也是
WINAPI
的另一个宏别名。那么这些宏之间有什么区别吗?在我看来,它们只是化名。为什么会有这么多呢?

因为在16位时,所有这些都是不同的约定。自x86平面模式以来,所有与windows相关的内容都是
\uu stdcall
(从右向左推,被调用方清除堆栈)<代码>\uuuCDECL,
\uuuuuFastCall
也存在

自x64以来,实际上存在一些问题,所有这些问题都被忽略了


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

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

WINAPI
STDMETHODCALLTYPE
都扩展到同一个东西:
\uu stdcall
用于x86,而不用于其他任何东西。那么,为什么同一事物有两个别名呢?因为它们控制不同子集的调用约定:

  • WINAPI
    指定基于C语言的平面Windows API的调用约定
  • 另一方面,STDMETHODCALLTYPE控制COM()的调用约定

COM和Windows API是独立的。使用两个别名来控制其中一个的调用约定非常有意义。您不想因为要使用新的ABI for Win128而中断所有COM。

Windows历史悠久,可以追溯到16位Windows。这些宏在现代32位窗口中是相同的,这并不意味着它们总是相同的。这些不是打字错误。有API(“应用程序编程接口”),然后是(“应用程序二进制接口”)。我真的是指我写ABI的地方。