有充分的理由吗?

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

最佳答案

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

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

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

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

10-10 12:44