DLL调用异常:The value of ESP was not properly......
2014-10-09 12:45
477 查看
举例:
.cpp
.h
.def
在EXPORTS模块下边添加导出函数名字:Multiplya
编译生成DLL加载:
看似没有啥问题,但是运行发现:
日志确实打印了:
但是却没有返回结果,并且弹出异常:
提示信息是调用不匹配导致栈里边的ESP不正常,但是感觉没啥问题啊,输入是int,输出是int
搜索问题,一般的原因写的是数组越界,但是没有数组问题啊,找了许久,终于找到了原因:
在函数调用前加入 WINAPI
仔细一看,DLL中声明有WINAPI ,但是调用的声明没有,导致出现返回时ESP不一致而异常,
这样改就没有问题了:
typedef int (WINAPI *Multiplya)(int factorA, int factorB);
这样,对于核心部分代码,非要用白盒去测试,这样是相对比较简便的方法了。
.cpp
IME_API int WINAPI Multiplya(int factorA, int factorB) { Log(-1,_T("[test] %d * %d = %d"),factorA,factorB,factorA * factorB); return factorA * factorB; }
.h
IME_API int WINAPI Multiplya(int factorA, int factorB);
.def
在EXPORTS模块下边添加导出函数名字:Multiplya
编译生成DLL加载:
typedef int (*Multiplya)(int factorA, int factorB); int main() { Multiplya multiplya; HMODULE handle = LoadLibrary(L"Test.dll"); if (handle) { multiplya = (Multiplya)GetProcAddress(handle,"Multiplya"); } else { FreeLibrary(handle); system("pause"); return 0; } if (multiplya != NULL) { cout <<multiplya(2,4); } if (handle) { FreeLibrary(handle); } }
看似没有啥问题,但是运行发现:
日志确实打印了:
但是却没有返回结果,并且弹出异常:
提示信息是调用不匹配导致栈里边的ESP不正常,但是感觉没啥问题啊,输入是int,输出是int
搜索问题,一般的原因写的是数组越界,但是没有数组问题啊,找了许久,终于找到了原因:
在函数调用前加入 WINAPI
仔细一看,DLL中声明有WINAPI ,但是调用的声明没有,导致出现返回时ESP不一致而异常,
这样改就没有问题了:
typedef int (WINAPI *Multiplya)(int factorA, int factorB);
这样,对于核心部分代码,非要用白盒去测试,这样是相对比较简便的方法了。
相关文章推荐
- dynamic DLL 调用错误 -The value of ESP was not properly saved across a function call
- DLL 调用错误 -The value of ESP was not properly saved across a function call
- DLL 调用错误 -The value of ESP was not properly saved across a function call.
- DLL 调用错误 -The value of ESP was not properly saved across a function cal
- DLL 调用错误 -The value of ESP was not properly saved across a function call.
- MFC开发遇到的异常Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call
- 调用DLL函数,出现错误 Run-Time Check Failure #0 - The value of ESP was not properly saved across a function
- 【Dll】Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.... 此错误的解决方法
- Run-Time Check Failure #0,The value of ESP was not properly saved 错误解决
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
- Run-Time Check Failure #0,The value of ESP was not properly saved 错误解决
- The value of ESP was not properly saved across a function call解决方案
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. 错误解决
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.... 此错误的解
- C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call问题。
- the value of esp was not properly saved
- Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
- the value of esp was not properly saved