Qt使用QAxObject操作Excel,在线程中调用失败

blankc 2011-09-01 11:26:31
前几天在论坛学到了如何使用QAxObject操作Excel表格,现在已经能够成功调用,实现了对Excel表格数据的读取。
但是今天在改进代码过程中却遇到了奇怪的问题:
由于连续读取Excel表格大量数据是个耗时操作,阻塞了GUI线程,我决定使用多线程机制。新建一个QThread子类,在run函数加入Excel连接的语句。于是问题出现了,同样的代码,在GUI线程下执行,没有问题,在新建的线程里面执行,却报了如下错误:

CoCreateInstance failure (??δ???? CoInitialize??)
QAxBase::setControl: requested control Excel.Application could not be instantiated


于是我开始调试,发现错误是出现在第一步初始化Excel COM组件的时候。代码如下:

QAxObject * excelApplication = new QAxObject("Excel.Application");


为了进一步做对比,我简化了函数,GUI主类MainWindow构造函数语句如下:

QAxObject * excelApplication = new QAxObject("Excel.Application");
excelApplication->dynamicCall("Quit()");
qDebug() << tr("------分隔符------");
mt = new myThread();
mt->start();


myThread的run函数:

QAxObject * excelApplication = new QAxObject("Excel.Application");


编译之后报错:

"------分隔符------"
CoCreateInstance failure (??δ???? CoInitialize??)
QAxBase::setControl: requested control Excel.Application could not be instantiated


可以看出前面的GUI线程中的操作是没有报错的,而后面在线程中执行的操作却报错了。希望大家能够帮我解决该疑惑,谢谢!
...全文
1954 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengna043 2012-06-11
  • 打赏
  • 举报
回复
你好,楼主,你是怎么用QT 读取的EXCEL 表格的数据的,可以告诉我一下?我想学习一下,最近在学习QT,有好多不明白的地方,麻烦把程序发给我看一下呗,谢谢,发给我的QQ 邮箱就行 46569315@qq.com
dbzhang800 2011-09-02
  • 打赏
  • 举报
回复
http://hi.baidu.com/cyclone/blog/item/15e4e950807743521038c2ab.html
blankc 2011-09-02
  • 打赏
  • 举报
回复
非常感谢1楼提供的信息。
的确是次线程的问题,OLE组件的初始化和释放默认在GUI线程中已经实现了。
在次线程中必须自己进行初始化和释放操作。如此,run函数可以改成:
    HRESULT r = OleInitialize(0);
if (r != S_OK && r != S_FALSE) {
qWarning("Qt: Could not initialize OLE (error %x)", (unsigned int)r);
}
QAxObject * excelApplication = new QAxObject("Excel.Application");
OleUninitialize();


并且在头文件中加入#include "qt_windows.h"引用

这样就没有问题了。

16,175

社区成员

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

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