您的位置:首页 > 产品设计 > UI/UE

DLL调用异常:The value of ESP was not properly......

2014-10-09 12:45 477 查看
举例:

.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);

这样,对于核心部分代码,非要用白盒去测试,这样是相对比较简便的方法了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dll C++ 异常
相关文章推荐