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

Ben*_*min 5 windows winapi calling-convention stdcall

有充分的理由吗?

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

Han*_*ant 8

它适用于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代码并不是我喜欢做的事情.

  • 缺少符号装饰是因为winapi二进制文件使用`.def`文件进行导出(剥离装饰和/或使用ordianl),这使得通过GetProcAddress导入简单,因为没有符号装饰 (2认同)
  • 有时我确实喜欢单步执行 Windows 代码,而且我可以说大多数时候 stdcall 也在内部使用。 (2认同)