我需要编写调用外部函数的代码,该函数可以是 32 位 Windows 应用程序中的 stdcall 调用或 cdecl。
我的代码(调用者)无法提前知道其中的哪一个。
现在,如果我尝试从定义为 stdcall 的调用站点调用 cdecl 函数,我会收到一个 checkEsp 异常对话框,我猜这是有充分理由的。
有什么办法可以做到吗?
可以通过以下方式完成:
mov esi, esp
push arg3
push arg2
push arg1
call [SomeExternalProc]
mov esp, esi ; now the stack is always properly cleaned
外部过程将保留 esi。或者您可以使用外部过程甚至内存变量保留的任何其他寄存器 - 本地或全局。
很好,CDECL 和 STDCALL 的参数顺序是相同的 - 顺序相反。 (最左边的 arg 位于最低地址。)因此,除了 ESP 返回时指向的位置之外,它们是兼容的。两个约定都同意哪些寄存器是调用保留的,哪些是调用破坏的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)