我需要编写一个调用外部函数的代码,该函数可以是32位Windows应用程序中的stdcall调用或cdecl。
我的代码,呼叫者,无法事先知道它将成为哪一个。
现在,如果我尝试从定义为stdcall的调用站点调用cdecl函数,我会得到一个checkEsp异常对话框,我猜这是有充分理由的。
有没有办法做到这一点?
答案 0 :(得分:3)
可以按照以下方式完成:
mov esi, esp
push arg3
push arg2
push arg1
call [SomeExternalProc]
mov esp, esi ; now the stack is always properly cleaned
外部程序应该保留esi。或者,您可以使用外部过程保存的任何其他寄存器,甚至是内存变量 - 本地或全局。
好,CDECL和STDCALL的参数顺序相反 - 顺序相反。
答案 1 :(得分:1)
您还可以使用alloca(),它具有保存和恢复堆栈指针的副作用:
{
alloca( (uintptr_t)callback & 2 );
callback();
}
答案 2 :(得分:0)
请参阅:http://en.wikipedia.org/wiki/X86_calling_conventions了解差异的定义。