有充分的理由吗?
它们的内部函数(未导出)也是 stdcall 约定吗?
它是对 32 位代码的 pascal 调用约定的改编。 Pascal 是 OS/2 和 Windows 3 等 16 位操作系统的调用约定。为什么选择 pascal 有点猜测,即使我当时还是个小小狗,但它的效率稍微高一些。当您只能使用 640 KB 时,这一点很重要。
大多数 Win32 函数都不是真正的 stdcall,因为它还规定了导出函数在呈现给链接器之前如何修饰。就像 void Mumble(int arg) 变成 _Mumble@4 一样。 @后面的数字描述了激活帧的大小。但大多数 Win32 函数都是在没有任何修饰的情况下导出的。可能是为了给程序员一个让 GetProcAddress() 工作的机会。我认为这种修饰的目的是帮助链接器检测声明的 API 函数签名与实际签名之间的不匹配。传递的参数数量不匹配会导致自动崩溃,因为被调用者将从堆栈中弹出更多或更少的参数,然后再传递。也很难诊断。 stdcall 的一个弱点是 cdecl 约定不存在这个问题。
内部调用是 stdcall、cdecl 和 thiscall 之间的混合体。虽然我不喜欢单步执行 Windows 代码,但不能说我曾经检测到某种模式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)