DLL函数动态加载调用后出现 Debug Error! 提示 The value of ESP was not properly saved across a function call.

wolong98 2006-06-21 02:25:38
我用VC调用 VC编写的动态连接库,
原函数声明方式是:
extern "C" __declspec(dllexport) bool CreateDataTable(SDBSrvPara *pSrvPara);

函数实现
__declspec(dllexport) bool CreateDataTable(SDBSrvPara *pSrvPara)
{
return true;
}



在另外一个程序用 LoadLibrary 动态加载这个DLL,
加载调用的声明格式是
typedef bool (CALLBACK * PROC_CreatePlugInDataTable)(SDBSrvPara *);

SDBSrvPara m_dbSrvPara; //是基本结构体(成员是 char,int基本类型的组合)
HMODULE hDeviceDll;
hDeviceDll = ::LoadLibrary(it->second.c_str()); //加载DLL
if( hDeviceDll != NULL)
{
PROC_CreatePlugInDataTable CreateDataTable =
(PROC_CreatePlugInDataTable)::GetProcAddress(hDeviceDll, "CreateDataTable");
if(CreateDataTable != NULL)
{
bool bResutl = CreateDataTable(&m_dbSrvPara);
}
::FreeLibrary(hDeviceDll); //卸载DLL
}

运行到CreateDataTable返回是出现下面的对话框内容.

Debug Error!
Program: F:\Test_Srv.exe
Module:
File: i386\chkesp.c
Line:42
The value of ESP was not properly saved across a function call. This is usually a
result of calling a function declared with one calling convention with a funtion pointer declared with a different calling convention.



麻烦大家帮忙看看,谢谢 ̄ ̄
...全文
303 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2006-06-22
  • 打赏
  • 举报
回复
正是调用约定不匹配造成的。
wolong98 2006-06-21
  • 打赏
  • 举报
回复
liushaoyi0704(【化外之民】)中添加 __stdcall 约定后
编译出错..

我的解决方法是
在函数声明改为
typedef bool (__cdecl * PROC_CreatePlugInDataTable)(SDBSrvPara *);
wolong98 2006-06-21
  • 打赏
  • 举报
回复
调步调试,在函数返回是
堆栈有4个字节的参数没有单出
问题解决了
谢谢 ̄
大熊猫侯佩 2006-06-21
  • 打赏
  • 举报
回复
在这之前设断点,然后单步调试一下
化外之民 2006-06-21
  • 打赏
  • 举报
回复
extern "C" __declspec(dllexport) __stdcall bool CreateDataTable(SDBSrvPara *pSrvPara);

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧