您的位置:首页 > 编程语言 > Qt开发

Qt调用DLL动态库接口函数程序崩掉

2014-11-27 17:57 615 查看
        工作中使用Qt开发,调用外部动态库.dll,在调用接口函数时总是运行之后崩掉,提示段错误!单步调试总有变量被意外改动,弄了两天在同事的帮助下解决!方法如下:在定义接口函数指针时添加  _stdcall,它的缺陷是只能运行在windows平台,不能跨平台
typedef _stdcall  int (*Func_WtDev_AxisCount)(int VehicleID);
问题解决!汗颜啊,学习之路漫长!

__stdcall

被这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈。
并不是所有的语言都支持_cdcel调用规则,但是都支持_sdtcall调用规则, 假如你用VC做了一个DLL,导出了某些函数,如果你想这个DLL被其他语言也能调用的话,VB.DEPHI.PB..你的把他的调用约定声明为__stdcallwindows   api都是_stdcall调用规则, 函数调用约定确定一个程序如何实现一个函数调用及参数如何传递。在单一语言程序中,调用约定几乎总是正确的,这是因为对所有模块总有一个缺省的约定并且头文件会负责调用和被调用程序之间的一致性。在一个混合语言程序中,不同的语言不可能分享同一个头文件。由于调用约定而产生的错误在编译时无法发现,直到程序在运行时(run-time)实现函数调用时才出现并会立即导致应用程序崩溃。 关键字                                                       栈的维护者          参数传递 __cdecl                                                                   调用者 参数反序入栈(右-> 左) __stdcall                                                             被调用者 参数反序入栈(右-> 左) __fastcall                                                            被调用者 参数先存寄存器,接着入栈 thiscall(并非关键字)       被调用者 参数入栈,this指针存ECX 在C++中,可以在函数声明或定义时用关键字__stdcall指定调用约定。__stdcall调用约定经常在Windows程序或API函数中使用。在GUI程序中,PASCAL、WINAPI和CALLBACK都被定义为__stdcall。C语言的缺省调用约定为__cdecl。 __stdcall产生的名字修饰是将名字符号前加下划线(_),并且后加”@”和函数参数字节数(所需栈空间)
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息