GetProcAddress()获取多参数函数的问题

bitxinhai 2008-09-28 07:36:28
#ifndef DLLEXPORT
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif

extern "C" DLLEXPORT int f(int a,int b);
首先导出一个函数f,他有两个参数
f函数的实现为
extern "C" int f(int a,int b)
{
return a+b;
}
在主函数里面获取函数地址的方法为:
HMODULE hModule = LoadLibrary("..\\DLL\\Debug\\Dll");

typedef int (WINAPI* lpFunction)(int,int);
if(hModule)
{
lpFunction f = (lpFunction)GetProcAddress( hModule, "f");


if(f)
{
CString s;
int a = f(2,3);//运行这一步就直接失败了??????出错信息为The value of ESP was
//saved across a function call!

s.Format("Sum of a and b is:%d",a);
MessageBox(s);
//f(2,3);
}
else
{
AfxMessageBox("GetProcAddress失败!");
GetLastError();
}
FreeLibrary(hModule);
}
else
{
AfxMessageBox("LoadLibrary失败!");
}

请问问什么会错误呢??
我如果用void型的函数,就不会出错!!
谢谢!!
...全文
598 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bitxinhai 2008-09-29
  • 打赏
  • 举报
回复
二楼的回复正确!!!!
baihacker 2008-09-29
  • 打赏
  • 举报
回复
还有pascal,nakedcall
3楼的会在
/GZ
启用堆栈检查 (/RTCs)
下有效...(VC)
野男孩 2008-09-29
  • 打赏
  • 举报
回复
关键字 堆栈清理 参数传递
__cdecl Caller 所有参数压栈, 逆序(从右至左)

__clrcall n/a 按顺序(从左至右).将参数压入CLR expression stack

__stdcall Callee 参数全部压栈,逆序(从右至左)

__fastcall Callee 前两个长度为DWORD或者更小的参数保存到寄存器(ecx和ecx),剩下的参数按
逆序(从右至左)压栈。

__thiscall Callee 参数全部压栈,this 指针保存到ECX

你这里的问题就是DLL中定义的函数是__cdecl调用约定,这是由调用者清理堆栈的。而在Exe里面把__cdecl函数当作__stdcall函数调用,导致堆栈不平衡。
帅得不敢出门 2008-09-28
  • 打赏
  • 举报
回复
chkesp 通常用来在调用用户函数后检查ESP的值时候正确(堆栈平衡)

一般是函数类型错误而产生, 比如__cdecl的函数当作 __stdcall 使用, 反之也会不对

还有指针f为什么要与函数名相同
jia_xiaoxin 2008-09-28
  • 打赏
  • 举报
回复
将typedef int (WINAPI* lpFunction)(int,int);
改为
typedef int (* lpFunction)(int,int);
baihacker 2008-09-28
  • 打赏
  • 举报
回复
typedef int (WINAPI* lpFunction)(int,int);

这里是说一个stdcall的函数指针





#ifndef DLLEXPORT
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif

extern "C" DLLEXPORT int f(int a,int b);
首先导出一个函数f,他有两个参数
f函数的实现为
extern "C" int f(int a,int b)
{
return a+b;
}

在默认情况下,上面的f是cdecl的.
因为要用WINAPI来修饰一下f,也就是说把f的调用方式从cdecl换成stdcall.

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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