标签:CoInitializeEx 初始化 return 对话框 MB QFileDialog 本地 COM
1.问题描述
今天遇到很奇怪的问题,QString strFile = QFileDialog::getOpenFileName(this, "选择Excel文件", m_defalutPath, tr("Exel file(*.xls *.xlsx)"));老是打不开系统保存文件的对话框,代码调试发现执行到这一句,就卡死了,阻塞,没有继续往下走;新建一个工程,可以打开,放到构造函数中,可以打开,最后一个参数设置为QFileDialog::DontUseNativeDialog可以打开QT的选择对话框,可就是放到成员函数中打不开;搞了一下午;
后来在一个英文网站找到了原因;https://stackoverflow.com/questions/31983412/code-freezes-on-trying-to-open-qdialog
因为程序当中,使用了CoInitializeEx函数,这个函数会以独占的方式使用COM端口发送消息,执行命令, QFileDialog::getOpenFileName函数也需要通过COM端口发送消息,造成死锁。
int TextToSpeech::Init() { //初始化COM组件 ::CoUninitialize(); if(FAILED(::CoInitializeEx(NULL,0))) { //MessageBox("初始化COM组件失败!", "提示", MB_OK|MB_ICONWARNING); return -1; } m_bComInit = TRUE; if (CreateSpVoice() == -1) { return -1; } //SetVolume(10); return 0; }
2.解决办法
将CoInitializeEx(NULL,0))改成CoInitializeEx(NULL,COINIT_APARTMENTTHREADED),COINIT_APARTMENTTHREADED意思是在分离的线程中初始化COM
int TextToSpeech::Init() { //初始化COM组件 ::CoUninitialize(); if(FAILED(::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED))) { //MessageBox("初始化COM组件失败!", "提示", MB_OK|MB_ICONWARNING); return -1; } m_bComInit = TRUE; if (CreateSpVoice() == -1) { return -1; } //SetVolume(10); return 0; }
标签:CoInitializeEx,初始化,return,对话框,MB,QFileDialog,本地,COM 来源: https://www.cnblogs.com/bclshuai/p/16611528.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。