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

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

适用玉柴杭叉叉车配件发动机涨紧轮D5400-1002450-C83AL000001
| 月销量0件
优惠价344.5元
原价¥344.5

淘口令:

¥5UuFX9CaAM2¥
 

开发环境: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
分享
评论 抢沙发