这两天写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必然崩溃。
分享到:
相关推荐
对于第三方提供的二进制库,开发者应当要求尽可能多的信息,包括函数调用的约定和地址映射,以便能够正确地调用库函数并确保代码的稳定运行。 总结来说,使用指针调用函数时产生Hard Fault的问题,是由于Cortex-M...
所以猜解可能会有错误,需要结合已知函数库或反汇编查看,另此方法对于cdecl调用函数无效. 4.关于反汇编视图的"到首返回"如果勾选即表示仅反汇编到头一个RETN为止,否者将按照"DisAsm_MaxLine" 所指定的行数.生效...
遵循eabi规范的编译器和链接器可以与其他符合同一规范的工具无缝配合工作,这让软件开发者可以选用不同的工具厂商的产品,而不会引起兼容性问题。这大大提高了开发的灵活性和工具选择的多样性。 总结以上内容,...
- `_declspec(dllimport)` 用于在使用DLL的客户端代码中声明函数或类,告诉编译器这些符号是从外部DLL导入的,以便正确地生成调用约定。 - `_declspec(dllexport)` 则是在DLL本身的源代码中声明函数或类,表明它们...
这种方式可以避免 C++ 编译器引起的函数名修饰(mangling)问题。 4. **使用 pragmas**:虽然不如前两种方法常用,但在某些情况下也有效果,例如通过 `#pragma comment` 指令来告诉编译器输出特定的函数。 ##### ...
12. 扇入和扇出:它们是衡量函数复杂性的两个指标,扇入是函数被调用的次数,扇出是函数调用其他函数的次数。合理的扇入和扇出可以保持函数的独立性和功能的明确性。 13. 断言:在调试版本中使用断言来确保程序的...
这告诉编译器要执行函数调用,而不是宏展开。如 `(f)()` 调用的是函数 `f`,而不是宏 `f`。 6. **优先级调整**:在某些情况下,可以利用预处理器特性来调整优先级。例如,如果一个函数需要被调用,但在某个特定条件...
8. 定义和实现一个类的成员函数为回调函数:通常需要使用`extern "C"`声明函数,以符合C语言的调用约定,并且通常需要一个非成员函数作为接口,将成员函数作为参数传递给其他函数或注册机制。 9. C++程序的执行并非...
创建DLL时,需要注意的是,由于DLL可以被多种语言编写的程序调用,因此导出的函数应该使用C语言调用约定。在DLL项目中,使用extern “C”确保函数以C语言的方式编译,而__declspec(dllimport)用于声明函数是从DLL...
使用`_stdcall`或`_cdecl`调用约定,确保函数调用的兼容性。 3. **内存管理**:由于自定义类型可能涉及复杂的内存分配和释放,因此必须谨慎处理。在DLL中创建自定义类型的实例时,通常需要由DLL负责分配内存,并在...
- 内联函数在编译时会被展开,以减少函数调用的开销。 - 但是,过度使用内联函数可能导致代码膨胀。 **8.6 一些心得体会** - C++函数的高级特性为编写高效、灵活的代码提供了强大的支持。 - 理解这些特性并合理使用...
这些错误通常是由代码语法错误、文件丢失、类或函数声明不匹配等问题引起的。以下是对20种最常见的VC++编译错误信息的详细解释及解决方法: 1. **fatal error C1010**: 当编译器在寻找预编译头文件时提前遇到了文件...
- **解决方案**:确保覆盖函数的返回类型和调用约定与基类相同。 - **错误C2660:'SetTimer':函数不接受2个参数** - **原因**:SetTimer函数参数数量不正确。 - **解决方案**:根据SetTimer函数的要求调整参数...
* 对多线程访问的变量、方法,必须加锁保护,避免出现多线程并发访问引起的问题。 * 线程使用时,要在代码框架中使用线程池,避免创建不可复用的线程;禁止在循环中创建新线程,否则会引起JVM资源耗尽。 3. 对称...
异常是在程序执行期间发生的不正常情况,通常由运行时错误或意外条件引起。在Java中,异常是通过`Exception`类及其子类表示的。当一个函数遇到无法正常处理的情况时,抛出异常是一种常见的处理方式。例如,`...
五、函数参数问题 (一) 无名的函数形参 声明函数时可以包含一个或多个用不到的形式参数。这种情况多出现在用一个通用的函数指针调用多个函数的场合,其中有些函数不需要函数指针声明中的所有参数。看下面的例子: ...
- **函数调用**:函数调用应易于阅读,参数列表清晰。 - **列表初始化格式**:列表初始化应使用花括号`{}`,并适当缩进。 - **条件语句**:条件语句应清晰地展示其分支结构。 - **循环和开关选择语句**:循环和开关...
在易语言中,可以使用`_stdcall`声明函数调用约定,模拟Windows API的Hook机制,如SetWindowsHookEx函数。 2. **原函数逻辑复制**:Hook后,我们需要复制原函数的逻辑,确保不影响微信的正常运行。在执行完自定义...
- 构造函数(Constructors):构造函数是类对象创建时所调用的特殊成员函数,应当注意构造函数的合理使用以及构造函数中可能出现的异常安全性问题。 - 默认构造函数(Default Constructors):当没有显式提供构造...