当前位置: 首页 > 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.xdnf.cn/news/1252567.html

相关文章:

  • Kubesphere搜索镜像问题
  • Packets Frames 数据包和帧
  • SQL120 贷款情况
  • 利用C++11和泛型编程改进原型模式
  • .Net下载共享文件夹中的文件
  • Java Stream API 详解(Java 8+)
  • Linux---第二天---基础指令
  • 快速莫比乌斯变换(FMT)与莫比乌斯反演 例题:树上lcm
  • SELinux 安全机制详解与管理
  • 组合期权:跨式策略
  • 批量提问程序开发方案:基于Python的百度文小言接口实现
  • 基于 Jenkins Pipeline 实现 DITA 文档自动化构建与发布(开源方案)
  • 百度智能云给“数字人”发工牌
  • Boosting 知识点整理:调参技巧、可解释性工具与实战案例
  • Bug 记录:SecureRandom.getInstanceStrong()导致验证码获取阻塞
  • 【motion】标签体系设计与检索 1:HumanML3D 和 KIT Motion-Language(KITML)
  • Java 使用动态代理和反射实现字段变更跟踪
  • 生成网站sitemap.xml地图教程
  • 【STM32U385RG 测评】基于VSCode的STM32开发环境搭建
  • 西门子PLC基础指令6:读取时钟指令、设置时钟指令、使能含义与注意
  • 【32】C++实战篇—— m行n列的坐标点,求每行相邻点X差值dX,每列相邻点y差值dY,并以矩阵形式左端对齐
  • JAVA--流程控制语句
  • 【VS + Qt】VS2022 Qt 开发中 ui_xx.h 文件编辑报错但编译正常的问题解决
  • 「iOS」————单例与代理
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘caffe’问题
  • 河南萌新联赛2025第四场-河南大学
  • K8S云原生监控方案Prometheus+grafana
  • yolov1-v3原理解析
  • DHCP 服务器与DNS服务器
  • 服务器——“查询不到显卡驱动,且输入nvidia-smi报错”的解决办法