QT----QAxObject在子线程中调用,发现excel指针为空

问题描述

excel操作耗时,想把它放入子线程,但是放入子线程后,运行发现在pWorkbooks指针就是空的,而不放入子线程,程序能够正常运行

c 复制代码
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。