C++BUIDER运行时报错:external exception c000001d;调试跟踪,错误位置定位在调用DLL的导出函数,但不是在函数内部某一特定语句处,而是函数执行完成后“}”处。
null
开发环境: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
暂无评论内容