【发布时间】:2012-07-01 00:07:31
【问题描述】:
我的问题是 MSVS 2010 C++ 编译器在从另一个 dll 的运行时解析的函数调用 (GetProcAddress+GetModuleHandle) 返回后以某种方式生成代码,然后编译器尝试以这种方式对齐堆栈:
CALL DWORD PTR DS:[2000367C] ; apiresolvedinruntime.dll
ADD ESP,12 ; <- this is the stack alignment
这当然是覆盖了返回地址,我的程序崩溃了,有人能解释一下为什么编译器在不应该这样做的时候对齐堆栈吗?
【问题讨论】:
-
请贴出(a)模块中函数的声明,(b)如何通过
GetProcAddress获取函数指针,以及(c)如何调用函数。 -
听起来像是调用约定不匹配:__stdcall vs. __cdecl,也许。您是否使用与您正在调用的函数匹配的类型正确地注释了函数指针的类型?
标签: c++ visual-studio assembly calling-convention