qt加载dll,运行一次后出错

尘中远 2013-08-05 08:51:35
由于qt的beep函数不能提供频率和时间这两个参数,使用QApplication::beep();后发现声音特别小,于是决定直接加载Windows的Beep函数

Beep函数在msdn的定义是:
Beep Function
Generates simple tones on the speaker. The function is synchronous; it performs an alertable wait and does not return control to its caller until the sound finishes.

BOOL WINAPI Beep(
__in DWORD dwFreq,
__in DWORD dwDuration
);


Requirements


Header
Declared in Winbase.h; include Windows.h.

Library
Use Kernel32.lib.

DLL
Requires Kernel32.dll.

于是我就打算加载Kernel32.dll这个dll调用Beep这个函数

代码如下

bool Beep(int nfre,int nts)
{
#ifdef Q_OS_WIN
qDebug()<<"win";
typedef int (*winBeep)(unsigned long ,unsigned long); //定义函数指针,以备调用 unsigned long == dword
QLibrary winlib("Kernel32.dll");
if (winlib.load()) //判断是否正确加载
{
winBeep pBeep = (winBeep)winlib.resolve("Beep"); //援引 Beep() 函数
if (pBeep) //是否成功连接上 add() 函数
{
bool r = pBeep(nfre,nts);
return r;
}
}
#else
QApplication::beep();
return true;
#endif
return false;
}


运行时能听到滴一声,但是响完就死了,是什么原因?

qtc输出:
程序异常结束。
D:\V.....it-Release\release\Alert.exe 退出,退出代码: -1073740791
还有
退出代码: -1073741819
...全文
145 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiuxianshen 2013-08-06
  • 打赏
  • 举报
回复
其实Qt解析dll也是调用的系统函数
QTDIR/src/corelib/plugin/plugin.pri
win32 {
 SOURCES += plugin/qlibrary_win.cpp
}

unix {
 SOURCES += plugin/qlibrary_unix.cpp
}
你第一种方法用完后加个unload看看
尘中远 2013-08-06
  • 打赏
  • 举报
回复
引用 2 楼 xiuxianshen 的回复:
其实Qt解析dll也是调用的系统函数
QTDIR/src/corelib/plugin/plugin.pri
win32 {
 SOURCES += plugin/qlibrary_win.cpp
}

unix {
 SOURCES += plugin/qlibrary_unix.cpp
}
你第一种方法用完后加个unload看看
试过了,也是响一次后就死了!
尘中远 2013-08-05
  • 打赏
  • 举报
回复
我后来直接用隐式加载就没问题 pro: LIBS+= -L C:/Program Files/Microsoft SDKs/Windows/v7.0A/Lib -l Kernel32
extern "C"    //由于是C版的dll文件,在C++中引入其头文件要加extern "C" {},注意
{
        #include "C:/Program Files/Microsoft SDKs/Windows/v7.0A/Include/Windows.h"
}


bool AlertItemFrame::BeepEx(int nfre,int nts)
{
#ifdef Q_OS_WIN
//    qDebug()<<"win";
//    typedef int (*winBeep)(unsigned long ,unsigned long); //定义函数指针,以备调用 unsigned long  == dword
//    QLibrary winlib("Kernel32.dll");
//    if (winlib.load())              //判断是否正确加载
//    {
//        winBeep pBeep = (winBeep)winlib.resolve("Beep");    //援引 Beep() 函数
//        if (pBeep)                  //是否成功连接上 add() 函数
//        {
//            bool r = pBeep(nfre,nts);
//            return r;
//        }
//    }
    Beep(nfre,nts);
#else
    QApplication::beep();
    return true;
#endif
    return false;
}
课程摘要1 Qt音视频开发实战 是陈超老师用10年以上音视频一线实战开发经验,四年音视频开发教学经验打造的Qt音视频开发课程。2 Qt音视频开发实战以Qt c++开发为中心。所有课程全部围绕Qt音视频开发展开。3 非常适合那些只做Qt开发的工程师来学习,学习更容易一些。学习目标,培养高级Qt音视频开发工程师.4 Qt音视频开发实战适合那些掌握Qt基础开发,初级开发工程师,月薪在20k以下,通过学习,达到更高薪水的Qt高级开发工程师。 课程优势1 老师过去15年+ 音视频,网络通讯,数字图像处理一线实战经验。过去四年积累了丰富的音视频开发教学经验,学员从年薪30w~50w,就职于腾讯,阿里等各大互联网公司。2 老师10多年Qt开发经验,长期大量使用Qt开发项目,国内最早一批使用Qt的程序员。3 QQ 一对一教学指导,阶段性作业案例小项目指导,就业面试指导。 课程内容1 Qt 核心基础加强。对于那些学了很多年Qt开发而不得要领的学员非常友好。2 音视频开发基础。音视频原理,RGB YUV, 音频原理。图像压缩编码,音频压缩编码,H.264压缩,H.264编码原理 I P B SPS PPS解析,   视频存储容器,mp4 , AAC.  Qt音频视频采集,FFmpeg编码,解码,x264编码,AAC编码。mp3编码。格式转换。视频播放器内核。图像渲染。3 OpenGL数字图像处理基础。OpenGL基础,渲染管线,shader编程。滤镜,美颜,后期处理。编写渲染引擎。4 网络socket通讯编程,自定义私有协议。TCP/UDP音视频传输。 学员要求1 熟悉c/c++,掌握Qt基本控件,类基础。2 每天学习两小时,学习周期3~5个月,做完练习,小项目。

16,213

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧