当前位置:   article > 正文

QAXObject在多线程中的初始化及调用问题_qaxbase::dynamiccallhelper: object is not initiali

qaxbase::dynamiccallhelper: object is not initialized, or initialization fai

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资源释放同样需遵循同一线程原则,否则退出程序时会出错

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/170571
推荐阅读
相关标签
  

闽ICP备14008679号