简单的动态链接库调用出错了,望高手给予指教。

daitounaoshi 2010-04-26 09:50:42

extern "C" __declspec(dllexport) void GetStruct(Person* person); //dll导出函数声明
//结构体声明
struct Person
{
char* name;
char* sex;
char* address;
int age;
};
//dll导出函数的实现
__declspec(dllexport) void GetStruct(Person* person)
{
person->address = "CHINA";
person->age = 15;
person->sex = "男";
person->name = "程辉";
}




//调用DLL代码
//函数指针声明及定义
typedef void (__stdcall *GETINFOMATION)(Person* person);
GETINFOMATION Getinfomation;

//调用过程
m_hModule = LoadLibraryA("Sun.dll");
if(m_hModule == NULL)
{
MessageBox(_T("加载动态链接库失败"));
}
else
{
Getinfomation = (GETINFOMATION)GetProcAddress(m_hModule,"GetStruct");
}

//函数调用
Person person;
Getinfomation(&person);


错误提示:
Run-Time Check Failure #0 - 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 function pointer declared with a different calling convention.
...全文
339 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
daitounaoshi 2010-04-26
  • 打赏
  • 举报
回复
我原来没想到是调用方式的问题是因为我的dll里面还封装了其他几个函数。另外那些的声明方式和调用方式和这个函数是一样的,不同点是这个函数有参数,其他函数没有参数。而就只有这个函数出错。我就没望这方面想了。竟然真是这个原因导致这个错误。
oyljerry 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 daitounaoshi 的回复:]
谢谢大家了,按照三楼说的就可以了。怎么区分什么时候用__cdecl或__stdcall调用申明啊。希望有人能解释下。今天睡觉之前肯定结贴。再次谢谢大家了
[/Quote]
vc编译器默认的函数调用约定是_cdecl, 而你定义的函数调用是_stdcall,所以不一致,造成这个问题..

一般_stdcall是标准windows dll的调用,_cdecl是C++调用方式》
wltg2001 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 daitounaoshi 的回复:]
谢谢大家了,按照三楼说的就可以了。怎么区分什么时候用__cdecl或__stdcall调用申明啊。希望有人能解释下。今天睡觉之前肯定结贴。再次谢谢大家了
[/Quote]
如果DLL定义时写了_stdcall,那么调用时就要加_stdcall,如果什么都没写,那么就默认为_cdecl
daitounaoshi 2010-04-26
  • 打赏
  • 举报
回复
谢谢大家了,按照三楼说的就可以了。怎么区分什么时候用__cdecl或__stdcall调用申明啊。希望有人能解释下。今天睡觉之前肯定结贴。再次谢谢大家了
wltg2001 2010-04-26
  • 打赏
  • 举报
回复
person->address = "CHINA";
person->sex = "男";
person->name = "程辉";
================
这三个指针分配空间了吗?
Un1 2010-04-26
  • 打赏
  • 举报
回复
把调用申明那里的__stdcall去掉就可以了
尹成 2010-04-26
  • 打赏
  • 举报
回复
UP
zgl7903 2010-04-26
  • 打赏
  • 举报
回复
试试typedef void (__cdecl *GETINFOMATION)(Person* person);
underuwing 2010-04-26
  • 打赏
  • 举报
回复
mark
daitounaoshi 2010-04-26
  • 打赏
  • 举报
回复
解决的话,可立即给分。顶者有分。谢谢大家了

15,471

社区成员

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

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