__stdcall - WINAPI vs STDMETHODCALLTYPE vs APIENTRY
__stdcall - WINAPI vs STDMETHODCALLTYPE vs APIENTRY
我正在读取一些处理内存操作以修复游戏"问题"的游戏修复代码。我发现代码使用了 2 个WINAPI
和STDMETHODCALLTYPE
的宏。这些宏都被计算到指定函数调用约定的__stdcall
中。我还发现APIENTRY
也是WINAPI
的另一个宏别名。那么这些宏之间有什么区别吗?在我看来,它们只是别名。为什么有这么多?
Windows API 中的所有数据类型和调用约定都定义为别名(预处理器宏或typedef
s(。这允许稳定的 ABI,无论编译器或工具链如何。它还允许在不破坏现有代码的情况下更改 ABI(例如,当引入 64 位 Windows 时(。
WINAPI
和STDMETHODCALLTYPE
都扩展到同一件事: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 位。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- __stdcall - WINAPI vs STDMETHODCALLTYPE vs APIENTRY