MFC、VC++操作excel后,excel程序进程无法正常退出的非暴力处理方法

先说处理方式

1、最low的方式:强制结束进程

//打开进程得到进程句柄
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
if(hProcess!=NULL)
{ 	
	//结束进程	
	if (TerminateProcess(hProcess,0))
	{
		printf("结束进程成功\n");
		return 0;
	}
}

这种方式简单粗暴,但会存在进程安全问题,及可能引起数据丢失,慎用!!!!

2、释放顺序问题

与Execl相关的变量在关闭和释放的时候顺序必须正确。比如,要先使用Close(),后使用ReleaseDispatch。
顺序尽量做到先 Save—>Colse—>Release;
在Release时,我们尽量做到由内到外,Rang—>Sheet—>Sheets—>Book—>Books—>App
注:在app退出时,一定要注意顺序,是先Quit退出,再Release,如果先Release,将无法退出,即Quit—>Release。

	//Save—>Colse—>Release
	book.Save();
	book.Close(covOptional, COleVariant("C:\\test\\excel\\test.xlsx"), covOptional);
	books.Close();

	//释放对象(相当重要!)
	//由内到外,Rang—>Sheet—>Sheets—>Book—>Books—>App
	range.ReleaseDispatch();
	
	sheets.ReleaseDispatch();
	sheet.ReleaseDispatch();
	
	book.ReleaseDispatch();
	books.ReleaseDispatch();
	//App一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错
	//Quit—>Release
	app.Quit();
	app.ReleaseDispatch();

3、正确释放资源

当我们操作excel后,如果没有正确释放资源,导致进程被占用,那我们就无法退出进程。
下面我们就来讨论下,如何正确释放资源,使得进程最后正常释放退出。
注:与Execl相关的变量必须全部都要释放ReleaseDispatch。

哪些情况下资源需要释放,那又如何正确释放这些资源

在调用get_Item后,需要释放

1、CWorkbooks对象对get_Item调用后,无法释放

通过CWorkbooks对象调用get_Item接口后,如果不释放,会出现进程无法退出情况,如下使用后,可能会存在进程无法退出问题。

sheets.get_Item(_variant_t(1));

解决方案:

//方案一、先赋值给LPDISPATCH对象,然后通过release释放
LPDISPATCH lpSheets = sheets.get_Item(_variant_t(1));
lpSheets->Release();
//方案二,如果变量被AttachDispatch给其他对象则不需要手动释放,如
lpSheets = sheets.get_Item(_variant_t(1));
sheet.AttachDispatch(lpDisp);
//or
sheet.AttachDispatch(sheets.get_Item(_variant_t(1)));

对于方案一,需要注意的是,据我测试,在新版本office上这个bug应该是已经被微软优化,修复了,如果主动释放的话,会报错。
在这里插入图片描述

2、CRange对象对get_Item调用后,无法释放

通过CRange对象调用get_Item接口后,如果不释放,会出现进程无法退出情况,如下使用后,可能会存在进程无法退出问题。

range.get_Item(_variant_t(1));

解决方案:

//方案一、先赋值给VARIANT对象,然后通过VariantClear释放
VARIANT var = range.get_Item(_variant_t(1), _variant_t(1));
VariantClear(&var);
//方案二,如果变量被AttachDispatch给其他对象则不需要手动释放,如
LPDISPATCH lpRang = range.get_Item(_variant_t(1));
range.AttachDispatch(lpDisp);
//or
range.AttachDispatch(range.get_Item(_variant_t(1)));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/193869.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

带你用uniapp从零开发一个仿小米商场_10. 首页开发

图标菜单栏开发 轮播图开发完成后,就是图标菜单栏了 可以看出这些图标都是一样的样式,所以可以勇哥flex布局让他们每个占百分之20 代码如下,既然都是一样的那就直接用个循环嵌套一下 data数据如下 同样,为了能让这段代码能在别的地方也用到,我直接把它封装成组件 <templ…

nodejs+vue+elementui学生竞赛管理系统65o97

高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生体育 能力与创新思维、学生竟赛管理系统检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而我所在学院多采用半手工管理学生竟赛的方式&#xff0c;所以有必要开发学生竟赛管理系统来对学生…

成为AI产品经理——TPR、FPR、ROC、AUC

目录 一、PR图、BEP 1.PR图 2.BEP 二、灵敏度、特异度 1.灵敏度 2.特异度 三、真正率、假正率 1.真正率 2.假正率 三、ROC、AUC 1.ROC 2.AUC 四、KS值 一、PR图、BEP 1.PR图 二分类问题模型通常输出的是一个概率值&#xff0c;我们需要设定一个阈值&#xff…

金蝶Apusic应用服务器 任意文件上传漏洞复现

0x01 产品简介 金蝶Apusic应用服务器&#xff08;Apusic Application Server&#xff0c;AAS&#xff09;是一款标准、安全、高效、集成并具丰富功能的企业级应用服务器软件&#xff0c;全面支持JakartaEE8/9的技术规范&#xff0c;提供满足该规范的Web容器、EJB容器以及WebSer…

【uniapp】微信运行报错TypeError_ Cannot read property ‘FormData‘ of undefined

文章目录 一、报错详情&#xff1a;二、解决&#xff1a; 一、报错详情&#xff1a; 二、解决&#xff1a; npm install axios0.27.2 #或者 npm install axios1.3.4

“于阗佛国、美食和田”——“万人游新疆”推广活动走进企业

11月23日&#xff0c;在安徽省文旅厅、安徽省援疆指挥部、和田地区文旅局的指导和支持下&#xff0c;由安徽环球文旅集团组织的“于阗佛国、美食和田”——“万人游新疆”分享会在安徽合肥市财富广场瑞众保险&#xff08;原华夏保险&#xff09;3楼黄山厅会议室举行&#xff0c…

Django总结

文章目录 一、Web应用Web应用程序的优点Web应用程序的缺点应用程序有两种模式C/S、B/S C/S 客户端/服务端局域网连接其他电脑的MySQL数据库1.先用其他电脑再cmd命令行ping本机ip2.开放MySQL的访问 B/S 浏览器/服务端基于socket编写一个Web应用 二、Http协议1.http协议是什么2.h…

docker基础快速入门:基础命令、网络、docker compose工具

docker基础命令快速入门 目录 docker基本命令docker 网络docker compose Docker介绍 Docker是一个虚拟环境容器&#xff0c;可以将你的开发环境、代码、配置文件等一并打包到这个容器中&#xff0c;并发布和应用到任意平台中。 Docker的三个概念 镜像 Docker镜像是一个特…

销售漏斗是什么?

销售漏斗是一个重要的销售管理工具&#xff0c;它可以帮助销售人员更好地管理和跟踪潜在客户。销售漏斗模型通常被广泛应用于B2B销售中&#xff0c;它可以将销售过程细分为多个阶段&#xff0c;例如潜在客户、初步沟通、方案报价、谈判和签约等。 销售漏斗有以下作用&#xff…

【无头双向链表和链表练习题2】

文章目录 以给定值x为基准将链表分割成两部分&#xff0c;所有小于x的结点排在大于或等于x的结点之前输入两个链表&#xff0c;找出它们的第一个公共结点。给定一个链表&#xff0c;判断链表中是否有环无头双向链表的模拟实现ArrayList&#xff08;顺序表&#xff09;和LinkedL…

Linux git

1.Git 初识 不知道你⼯作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种⽂档时&#xff0c;为了防止文档丢失&#xff0c;更改失误&#xff0c;失误后能恢复到原来的版本&#xff0c;不得不复制出⼀个副本&#xff0c;⽐如&#xff1a; “报告-v1”? …

手摸手Element-ui路由VueRoute

后端WebAPI准备 https://router.vuejs.org/zh/guide/ https://v3.router.vuejs.org/zh/installation.html <template><el-table:data"tableData"style"width: 100%":row-class-name"tableRowClassName"><!-- <el-table-colum…

C#使用WebSocket进行链接

C#使用WebSocket进行网络链接&#xff0c;和服务端搭建一个长连接进行通信。 有两种方式&#xff1a;串口方式&#xff08;SerialPort&#xff09;和网口方式&#xff08;Socket 包括&#xff1a;TcpClient和UdpClient&#xff09; 准备&#xff1a; 1.C#使用WebSocket的一种…

PostgreSQL + SQL Server = WiltonDB

WiltonDB 是一个基于 PostgreSQL 的开源数据库&#xff0c;通过 Babelfish 插件支持 Microsoft SQL Server 协议以及 T-SQL 语句。 Babelfish 是亚马逊提供的一个开源项目&#xff0c;使得 PostgreSQL 数据库同时具有 Microsoft SQL Server 数据查询和处理的能力。Babelfish 可…

客户关系管理系统功能清单

客户关系管理系统功能清单 一、客户信息管理 1. 客户基本信息&#xff1a;包括客户名称、地址、电话、电子邮件等。 2. 客户关系信息&#xff1a;包括客户的购买历史、服务记录、支持案例等。 3. 客户分类信息&#xff1a;根据客户的重要程度、购买行为、偏好等因素&#xff…

Unity中Shader的BRDF解析(二)

文章目录 前言一、回顾一下上一篇的结尾在这里插入图片描述 二、我们来解析一下 UNITY_PBS_USE_BRDF1&#xff08;高配&#xff09;1、迪士尼BRDF原则2、迪士尼的漫反射函数3、参数&#xff1a;perceptualRoughness&#xff08;感性的粗糙度&#xff09;4、参数&#xff1a;hal…

【论文阅读笔记】InstructDiffusion: A Generalist Modeling Interface for Vision Tasks

【论文阅读笔记】StyleAvatar3D: Leveraging Image-Text Diffusion Models for High-Fidelity 3D Avatar Generation 论文阅读笔记论文信息引言动机挑战 方法结果 关键发现相关工作1. 视觉语言基础模型2. 视觉通用模型 方法/模型视觉任务的统一说明训练数据构建网络结构 实验设…

高端制造业中的通用性超精密3D光学测量仪器

超精密光学3D测量仪器具有高精度、自动化程度高、实时反馈和范围广等优势。它能够实现微米级别的精确测量&#xff0c;能够精确测量产品的尺寸、形状和表面粗糙度等&#xff0c;具有广泛的应用价值和重要意义。 超精密光学3D测量仪器配备多种传感器、控制器和计算机系统&#…

【华为OD】统一考试B\C卷真题 100%通过:开源项目热榜 C/C++实现

目录 题目描述&#xff1a; 示例1 示例2 题目描述&#xff1a; 某个开源社区希望将最近热度比较高的开源项目出一个榜单&#xff0c;推荐给社区里面的开发者。对于每个开源项目&#xff0c;开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数…

什么是数据增强,为什么会让模型更健壮?

在做一些图像分类训练任务时&#xff0c;我们经常会遇到一个很尴尬的情况&#xff0c;那就是&#xff1a; 明明训练数据集中有很多可爱猫咪的照片&#xff0c;但是当我们给训练好的模型输入一张戴着头盔的猫咪进行测试时&#xff0c;模型就不认识了&#xff0c;或者说识别精度…