windows - 为什么 Microsoft 选择 stdcall 作为他们的 API 约定?

标签 windows winapi calling-convention stdcall

有充分的理由吗?

它们的内部函数(未导出)是否也是 stdcall 约定?

最佳答案

这是对 32 位代码的 pascal 调用约定的改编。 Pascal 是 OS/2 和 Windows 3 等 16 位操作系统的调用约定。为什么选择 Pascal 有点猜测,即使我当时还是个小狗,但它的效率稍微高一些。当您只能使用 640 KB 时,这很重要。

大多数 Win32 函数都不是真正的 stdcall,因为它还规定了导出函数在呈现给链接器之前如何修饰。就像 void Mumble(int arg) 变成了 _Mumble@4。 @ 后面的数字描述了激活帧的大小。但是大多数 Win32 函数都是在没有任何修饰的情况下导出的。可能是为了给程序员一个让 GetProcAddress() 工作的机会。我认为装饰旨在帮助链接器检测声明的 API 函数签名与实际签名之间的不匹配。传递的参数数量不匹配是一个自动的 kaboom,因为被调用者会从堆栈中弹出或多或少的参数然后被传递。也很难诊断。 stdcall的弱点,cdecl约定没有这个问题。

内部调用是 stdcall、cdecl 和 thiscall 之间的混合包。不能说我曾经检测到一种模式,尽管我不喜欢单步执行 Windows 代码。

关于windows - 为什么 Microsoft 选择 stdcall 作为他们的 API 约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3555678/

相关文章:

c# - 在 WPF/C# 中使用全局键盘钩子(Hook) (WH_KEYBOARD_LL)

assembly - ARM 处理器上 BP 寄存器(帧指针)的等价物是什么?

windows - 如何在 Windows/命令行/文件打开对话框下匹配精确的文件扩展名?

c# - Process.WorkingSet64 和 Process.PeakWorkingSet64 的区别

winapi - QT (4) 对应 Win32 API 的等效宏/方法/常量?

windows - 如何检测 CLR 抛出的异常?

assembly - 如何在Assembly中打印数组

windows - ESP 的值未正确保存....和 ​​C/C++ 调用约定

windows - 模拟 RAM 使用的工具

c# - 在 C# 中将证书安装到 Windows 本地用户证书存储区