当前位置: 首页 > news >正文

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。

http://www.lryc.cn/news/611626.html

相关文章:

  • Excel制作尖刀图,直观展示业绩涨跌
  • EXCEL-业绩、目标、达成、同比、环比一图呈现
  • 从“T+1”到“T+0”:基于SQL构建MES到数据仓库的数据采集通道
  • OpenGL VBO:顶点缓冲对象的深度解析
  • 点穴式优化:用DeepSeek精准识别关键节点的产品体验突破法
  • PostgreSQL报错“maximum number of prepared transactions reached”原因及高效解决方案解析
  • 推荐一款优质的开源博客与内容管理系统
  • Mac安装WebStorm
  • C++11实现线程池(2)固定线程池
  • Java Stream API 详解(Java 8+)
  • 云计算一阶段Ⅱ——12. SELinux 加固 Linux 安全
  • 8.6学习总结
  • AI增强的软件测试工具
  • 网站、域名、IP在什么场景下需要备案
  • 动态代理常用的两种方式?
  • OA系统详解:有哪些功能、主流产品怎么选?
  • 自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网
  • 深度解析:AI如何重塑供应链?从被动响应到预测性防御的三大核心实践
  • 希尔排序:高效插入排序的进阶之道
  • 【JS-7-ajax】AJAX技术:现代Web开发的异步通信核心
  • 【Java String】类深度解析:从原理到高效使用技巧
  • 生成网站sitemap.xml地图教程
  • 从代码学习LLM - llama3 PyTorch版
  • GitHub Spark公共预览版上线
  • 利用OJ判题的多语言优雅解耦方法深入体会模板方法模式、策略模式、工厂模式的妙用
  • 本地服务器端部署基于大模型的通用OCR项目——dots.ocr
  • 达梦数据库日常运维命令
  • cdn是什么
  • 【C++】unordered系列容器使用及封装
  • 生成式 AI 重塑自动驾驶仿真:4D 场景生成技术的突破与实践