赞
踩
QT调用windows的excel,word时会用到QAxObject类,如果文件比较大的话会考虑使用多线程,将处理excel的代码放到非主线程中执行。这种情况下,初始化及调用需要谨慎,切记:初始化及调用的代码必须放在同一个线程中!
1 初始化
头文件<windows.h>
调用CoInitializeEx(nullptr, COINIT_MULTITHREADED);
如果是重写QThread::run函数,初始化一定要放在run函数中,因为除了run函数其他代码都是运行在主线程中的,如果放其他地方,初始化会失败,错误提示:
CoCreateInstance failure (尚未调用 CoInitialize。)
QAxBase::setControl: requested control Excel.Application could not be instantiated
QAxBase::dynamicCallHelper: Object is not initialized, or initialization failed
QAxBase::dynamicCallHelper: Object is not initialized, or initialization failed
同样道理,使用QObject:moveToThread时,QObject的对象肯定是在主线程中创建的,所以也不能在QObject对象的构造函数中初始化QAxObject.
2 调用
QAxObject类中的函数调用必须遵循哪个线程创建就在哪个线程中使用,否则会失败,错误提示:
QAxBase::dynamicCallHelper: Object does not support automation
3 QAxObject资源释放同样需遵循同一线程原则,否则退出程序时会出错
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。