QT----QAxObject在子线程中调用,发现excel指针为空
问题描述
excel操作耗时,想把它放入子线程,但是放入子线程后,运行发现在pWorkbooks
指针就是空的,而不放入子线程,程序能够正常运行
QScopedPointer<QAxObject> pExcel(new QAxObject("Excel.Application"));if (!pExcel){RYLog::getInstance()->appendLog("Error: Failed to create Excel Application object. Is Excel installed?");return;}pExcel->setProperty("Visible", false);// 获取工作簿集合 使用QScopedPointer智能指针可以在作用域结束时自动释放指针QScopedPointer<QAxObject> pWorkbooks(pExcel->querySubObject("Workbooks"));if (!pWorkbooks){RYLog::getInstance()->appendLog("Error: Failed to get Workbooks object from Excel.");pExcel->dynamicCall("Quit()"); // 退出Excel进程return;}
问题解决
头文件引用#include "windows.h"
,并在创建excel的代码前边加上CoInitializeEx(NULL, COINIT_MULTITHREADED);
代码就能够运行
Qt 的主线程默认是 STA,所以不需要自己手动调用。但你在子线程使用 COM(例如 QAxObject)时必须手动初始化!
它是 Windows COM(Component Object Model)初始化函数,它的作用是 在当前线程中初始化 COM 库,并指定使用的并发模型。COM 是微软提供的一套组件对象模型,很多 Windows API(比如 Excel 自动化、Shell 操作、DirectShow 等)都基于 COM。要在程序中使用 COM 对象(如 QAxObject 访问 Excel),就必须先初始化 COM。