如果在DLL中调用函数时没有传递足够的参数,会发生什么情况?

32位

__cdecl

所以在你的情况下,来电者:

  1. 推b
  2. 推一个
  3. 推送返回地址
  4. 调用函数。

在这一点上堆栈看起来像这样(例如,假设4字节的指针,记住堆栈指针向后移动):

+-----+ <--- this is where esp is after pushing stuff
| ret | [esp]
+-----+
|  a  | [esp+4]
+-----+
|  b  | [esp+8]
+-----+ <--- this is where esp was before we started
| ??? | [esp+12 and beyond]
+-----+

太好了。 现在问题发生在被调用方。 被调用者希望参数位于堆栈的某些位置,所以:

a[esp+4]b[esp+8]c[esp+12]
[esp+12]ab[esp+12]c
c
espc

64位

__cdecl
rcxrcxrdxr8r9xmm0xmm1xmm2xmm3esp

所以在你的情况下,来电者:

rcxarcxrdx

但被调用者期待:

rcxbrdxcr8
r8ccrcxrdxr8esp