动态调用DLL函数有时正常,有时报Access violation的异常


动态调用DLL函数有时正常,有时报Access violation的异常


typedef int (add *)(int a,int b);


void test()
{
hInst=LoadLibraryA("aimdtl.dll");
(FARPROC &)add=GetProcAddress(hInst,"add");
add(1,2);
}


按这个代码执行,add函数有时OK,有时报Access violation的异常。看到提示,第一反应就是内存异常了,但是这是什么引起了内存异常呢?
于是想着用一个变量来接收add的返回值看看。


void test()
{
hInst=LoadLibraryA("aimdtl.dll");
(FARPROC &)add=GetProcAddress(hInst,"add");
int sum=add(1,2);
}
结果,add函数执行了之后,还是有时OK,有时报Access violation的异常。这会是什么原因?于是谷歌了下,有人提到,可能要加__cdecall。于是我果断修改代码。新代码如下:


typedef int __cdecall (add *)(int a,int b);


void test()
{
hInst=LoadLibraryA("aimdtl.dll");
(FARPROC &)add=GetProcAddress(hInst,"add");
add(1,2);
}


结果,add函数执行了之后,还是有时OK,有时报Access violation的异常。纠结了!为什么 !!这时,想起在C中调用DLL函数时,需要用__stdcall,那是不是这里也要?立即改之!




typedef int __stdcall (add *)(int a,int b);


void test()
{
hInst=LoadLibraryA("aimdtl.dll");
(FARPROC &)add=GetProcAddress(hInst,"add");
add(1,2);
}




运行后,一切OK。问题至此已经解决。可这是为什么呢?于是回过头来看了看__stdcall和__cdecall的说法。


_stdcall:Win32 API的调用协议,由被调用的函数清理堆栈,所有参数自右至左入栈,生成的代码中函数名有一个_做前缀和一个@和参数的总字节数(十进制)作后缀。它不支持可变参数,但它产生的代码比_cdecl短,因为没有每次调用后的清理堆栈的代码。


_cdecl:C\C++的缺省调用协议,由调用者清理堆栈,这就是C\C++中可以使用可变参数的函数的原因,所有参数自右至作入栈,生成的代码中函数名有一个_做前缀.


至此算是明白过来了,一般dll中的函数都采用extern "C" __stdcall的方式引出函数接口的,在调用DLL中的函数时,如果没有加__stdcall和__cdecall是缺省调用了__cdecall,而__cdecall是要由调用者清理堆栈的,而在代码中并没有清理堆栈的操作,只是调用了函数,所以调


用函数的地址可能会跑飞。不跑飞就OK,而一旦跑飞就出现Access violation的异常。而_stdcall是由被调用的函数清理堆栈,所以调用函数的地址不会跑飞,自然也就OK了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、GUI新手之——教你读懂GUI的M文件 10 2、GUI程序中改变current directory引起的问题 15 3、GUI中h0bject和handles 的区别 16 4、handles结构中句柄和对象的关联问题 17 5、Matlab利用定时器连续显示图片的问题 19 5-1、GUI中实现在图片任意位置上标注text 22 5-2、使用edit的另外一种callback 22 6、MATLAB 如何实现图像的任意裁减? 22 7、坐标轴标注刻度、网格、文字方向 23 8、Matlab中对uitable的操作:调节各列宽度,设定某列是可编辑的 24 9、将在Matlab下编写的GUI转成独立于Matlab平台的应用程序 25 10、要将用Matlab语言编写的函数文件编译成可独立执行的*.exe文件 28 11、matlab GUI程序转换成exe可执行文件 31 12、gui生成独立的应用程序的发布问题 33 13、GUI控制simulink模块及参数的综合实例! 34 13-1、在axes显示图像后,在图像上单击鼠标时,回调函数的定义规则和使用方法 35 14、如何在循环中加入waitbar,并在waitbar上添加‘取消’按钮 36 15、在matlab中对信号进行FFT变换 38 16、动态显示figure中曲线的x-y坐标值的一个函数 40 17、在GUI界面的打开按钮中,如何对文件进行操作 42 18、Matlab不同控件之间的数据传递问题 45 19、在edit box里输入相关数据后,直接按回车键,不用鼠标点击pushbutton 就可以直接执行 46 19-1 GUI使用editbox输入数据后如何自动清除数据 46 20、在GUI中,计算结果怎么用excel来保存到指定的文件夹中 47 21、如何得到popupmenu选项中最后一个字符串的VALUE值 49 22、回调函数互相调用的问题 49 22-2string和number相互转换的问题 50 等等问题的解决办法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值