这两天写ap,调用了系统动态库中的函数。
按照文档,QLibray,load,resovle,执行都没问题,但是release版本发布时出问题了,只要执行必然内存访问错误崩溃退出。
开始跟踪调试,注释掉QLibrary所有相关的代码,执行ok;
只保留到load,执行ok;
保留到resolve,执行ok;
执行resolve的函数,运行崩溃。于是怀疑是调用时堆栈约定有问题,将函数声明为__stdcall后,问题解决。原来的默认是__cdecl,堆栈被破坏了。
修改后的代码类似下面:
typedef HRESULT (__stdcall *aeroEffectCheck)(BOOL *pfEnabled);
QLibrary* lib = new QLibrary("dwmapi.dll");
aeroEffectCheck aeroCheckFunc = (aeroEffectCheck)lib->resolve("DwmIsCompositionEnabled");
if( aeroCheckFunc && (aeroCheckFunc(&aeroFlag) ......
如果不用__stdcall修饰,只要执行aeroCheckFunc必然崩溃。
分享到:
相关推荐
Visual C/C++的编译器提供了几种函数调用约定,了解这些函数调用约定的含义及它们之间的区别可以帮助我们更好地调试程序。在这篇文章里,我就和大家共同探讨一些关于函数调用约定的内容。 Visual C/C++的编译器支持...
函数调用方式决定了函数参数入栈的顺序,是由调用者函数还是被调用函数负责清除栈中的参数等问题,而函数名修饰规则决定了编译器使用何种名字修饰方式来区分不同的函数,如果函数之间的调用约定不匹配或者名字修饰不...
本文主要讲叙了各种函数调用约定,以及它们之间的区别和联系,可以方便程序员在编程序的时候更好地利用各种约定,写出好的程序。
C/C++函数调用约定的区别 函数参数入栈的方式顺序
5、naked call采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存
函数调用约定 介绍函数调用方式的, 多用于dll,win API等地方.
这种协议规定了该语言的函数中的参数传送方式、参数是否可变和由谁来处理堆栈等问题。不同的语言定义了不同的调用约定。 在C++中,为了允许操作符重载和函数重载,C++编译器往往按照某种规则改写每一个入口点的符号...
函数调用约定解析及dll中调用约定[收集].pdf
本文章阐述了常用的函数调用约定,并对其进行了比较,这样可以很好地指导程序员在编程时正确无误地定义函数的调用约定。
本文主要探讨C/C++语言函数间参数的传值和传地址机制,同时探讨了计算机在调用一个函数时采用什么样的方法来自适应的处理函数中的参数,即函数调用约定.
remote-function是一个跨进程通讯库,它可以像调用本进程函数一样调用另外一个进程的函数。 remote-function支持调用普通函数,也支持调用类的成员函数。 remote-function底层使用命令管道进行通讯,内置的流程完成...
函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一个函数的调用的呢?参数入栈、函数跳转、保护现场、回复现场等又是怎样实现的呢?本文将对函数调用的过程进行深入的分析和详细解释,并在VC ...
C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用
自动生成c++函数调用关系图,里面包含了所有要用到的软件,一站式服务; 通过本人亲测的使用总结; 还有使用到的配置文件(c++的),实在不会配置可以直接使用; 改一改配置文件,应该还可以生成c,java,c#语言的调用...
C函数调用约定
C++自动生成函数调用关系图.rar
系统调用与系统函数调用表 系统调用与系统函数调用表
matlab子函数调用方法说明-子函数调用.pdf 今天看了一下matlab子函数的调用,发现这个资料比较好,说的比较清楚,和大家共享一下。 子函数调用.pdf 子函数调用方法
C和C++函数调用约定之间的转换[文].pdf