C++BUIDER运行时报错:external exception c000001d

C++BUIDER运行时报错:external exception c000001d;调试跟踪,错误位置定位在调用DLL的导出函数,但不是在函数内部某一特定语句处,而是函数执行完成后“}”处。

enter键 发泄超大号解压回车键usb电脑办公键盘程序员解压神器抖音网红Big Enter午睡枕头解压发送键创意礼物
enter键 发泄超大号解压回车键usb电脑办公键盘程序员解压神器抖音网红Big Enter午睡枕头解压发送键创意礼物
解压神器 网红同款 一键多用 午睡枕头 | 月销量700件
券后19.8-3=16元
原价¥19.8

淘口令:

¥U1db2LLYvjG¥
 

开发环境:C++BUILDER6、win7 64位

后来发现,DLL函数导出形式:void _export _stdcall Func1(param);

但在主程序中,声明的函数指针:void (*Func1)(param);

(FARPROC&)Func1 = GetProcAddress( DLL_Name, “Func1” );

然后调用Func1()就报错。

解决方案:声明的函数指针:void (*Func1)(param);改为void _stdcall (*Func1)(param);

也就是之前的声明中少了一个关键字_stdcall;

问题虽然解决了,但我还有个疑问:DLL的其他导出函数调用也存在类似的缺少_stdcall的情况,却能调用成功;

后来才发现,其他函数没有参数,而_stdcall是函数约定调用关键字的一种,它的一个作用就是约定特定的参数调用顺序:

__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:
1.参数传递顺序
2.调用堆栈由谁(调用函数或被调用函数)清理
常见的函数调用约定:stdcall cdecl fastcall thiscall naked call
__stdcall表示
1.参数从右向左压入堆栈
2.函数被调用者修改堆栈
3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。
这就不难解释我的疑问了。
© 版权声明
THE END
喜欢就支持一下吧,技术咨询可以联系QQ407933975
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片