调用可以是cdecl或stdcall的函数

我需要编写一个调用外部函数的代码,这个函数可以是32位Windows应用程序中的stdcall call或cdecl
我的代码,来电者,不能预先知道其中的哪一个。 现在,如果我尝试从被定义为stdcall的调用站点调用一个cdecl函数,那么我会得到一个checkEspexception对话框,而且我猜测这是有原因的。
有没有办法做到这一点?

Solutions Collecting From Web of "调用可以是cdecl或stdcall的函数"

它可以按照以下方式完成:

mov esi, esp push arg3 push arg2 push arg1 call [SomeExternalProc] mov esp, esi ; now the stack is always properly cleaned 

外部程序应该保留esi。 或者你可以使用外部过程保存的任何其他寄存器,甚至是内存变量 – 本地或全局变量。

好的,CDECL和STDCALL的参数顺序是相同的 – 以相反的顺序。

你也可以使用alloca(),它具有保存和恢复堆栈指针的副作用:

 { alloca( (uintptr_t)callback & 2 ); callback(); } 

cdecl和stdcall根据定义是不兼容的。 在cdecl中,调用者清理堆栈,在stdcall中被调用者清理堆栈。 如果你认为stdcall,但实际上是cdecl,没有人清理堆栈。 这意味着您的ESP(堆栈指针)将在通话后被搞砸。 也许如果你提供更多的细节,可能有一个解决办法,但没有办法调用一个函数,而不知道它是调用约定,而不会弄乱你的堆栈。

请参阅: http : //en.wikipedia.org/wiki/X86_calling_conventions了解差异的定义。