根据Excel线程句柄得到ID并且关闭进程
[System.Runtime.InteropServices.DllImport("User32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
private void Kill(Microsoft.Office.Interop.Excel.Application excel)
{
IntPtr t = new IntPtr(excel.Hwnd); //得到这个句柄,具体作用是得到这块内存入口
int k = ;
GetWindowThreadProcessId(t, out k); //得到唯一标志k
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); //k的引用
p.Kill(); //关闭k
}
GC.Collect的代码是: /// <summary>
/// 读取xls(用GC的方法,手工设置book为null)
/// </summary>
private void ReadXlsGetRangeA1()
{
string path = "C:\\abc.xls"; // 判断文件不存在,返回
if (!File.Exists(path))
{
return;
} Excel.Application excel = new Excel.ApplicationClass(); // 某人
//Excel.Workbooks workbooks = null; // 不用单独定义也可以
Excel.Workbook book = null;
Excel.Worksheet sheet = null;
Excel.Range range = null;
object oV = System.Reflection.Missing.Value; // 反复用到 try
{
// 步骤1:打开某人的表xls
book = excel.Workbooks.Open(path, oV, oV, oV, oV,
oV, oV, oV, oV, oV, oV, oV, oV, oV, oV); // 打开一个工作簿
sheet = (Excel.Worksheet)excel.ActiveSheet;// 获取当前工作表
sheet.Name = "Salary详细"; // 修改工作表的名字
excel.Visible = false; // 步骤2:读取数据
range = sheet.Cells.get_Range("A1", "A1"); //读取第一行第一列的内容
this.Text = range.Value2.ToString(); // 现在是form的标题 // 步骤3:保存表格
book.Save(); // 步骤4:关闭book
excel.Workbooks.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
book = null;
sheet = null;
range = null;
excel = null;
GC.Collect(); // 前提是:所有的对象都=null后才能调用此函数,然后才会结束“任务管理器”中的excel.exe进程
}
} 用Kill的方法的代码是: using System.Runtime.InteropServices; // DllImport用 [DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); /// <summary>
/// 读取xls(用kill的方法)
/// </summary>
private void KillReadXlsGetRangeA1()
{
string path = "C:\\abc.xls"; // 判断文件不存在,返回
if (!File.Exists(path))
{
return;
} Excel.Application excel = new Excel.ApplicationClass(); // 某人
//Excel.Workbooks workbooks = null; // 不用单独定义也可以
Excel.Workbook book = null;
Excel.Worksheet sheet = null;
Excel.Range range = null;
object oV = System.Reflection.Missing.Value; // 反复用到 try
{
// 步骤1:打开某人的表xls
book = excel.Workbooks.Open(path, oV, oV, oV, oV,
oV, oV, oV, oV, oV, oV, oV, oV, oV, oV); // 打开一个工作簿
sheet = (Excel.Worksheet)excel.ActiveSheet;// 获取当前工作表
sheet.Name = "Salary详细"; // 修改工作表的名字
excel.Visible = false; // 步骤2:读取数据
range = sheet.Cells.get_Range("A1", "A1"); //读取第一行第一列的内容
this.Text = range.Value2.ToString(); // 现在是form的标题 // 步骤3:保存表格
book.Save(); // 步骤4:关闭book
excel.Workbooks.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
excel.Quit();
//excel = null; // 注意:如果要获得excel的Hwnd,不能设置excel = null。 IntPtr t = new IntPtr(excel.Hwnd);
int k = ;
GetWindowThreadProcessId(t, out k);
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
p.Kill();
}
}
Path.GetFileNameWithoutExtension() //返回不具有扩展名的指定路径字符串的文件名。
Path.GetTempFileName() //创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径
根据Excel线程句柄得到ID并且关闭进程的更多相关文章
- CloseHandel(_beginthreadex): 只是关闭了线程句柄对象,并不会结束线程。
今天在测试程序的时候,在[任务管理器]中发现进程序的句柄随着多线程的不断运行,会不断的 +1. 发现原来在我的代码中,启动线程后都没有显式的调用 CloseHandle() 来关闭线程句柄. 当我准备 ...
- 线程、线程句柄、线程ID
什么是句柄:句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 ...
- 【windows 操作系统】线程句柄HANDLE与线程ID的关系
什么是句柄 句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访 ...
- 线程句柄和线程ID的区别
●CreateThread() API 用于创建线程. API 返回同时线程句柄,并通过参数得到线程标识符 (ID). 线程句柄有完全访问权创建线程对象. 运行线程时线程 ID 唯一标识线程在系统级别 ...
- c++ 多线程:线程句柄可以提前关闭,但是线程并没有关闭
很多程序在创建线程都这样写的:ThreadHandle = CreateThread(NULL,0,.....);CloseHandel(ThreadHandle );1,线程和线程句柄(Handle ...
- Windows中句柄和ID的区别
写在前面:这里介绍句柄 对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚.查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以 ...
- C# 关闭进程的时候总是捕捉到System.Threading.ThreadAbortException: 正在中止线程
C# 关闭进程的时候总是捕捉到System.Threading.ThreadAbortException: 正在中止线程 这是由ThreadAbortException抛出的 可以写成下面的样子 tr ...
- std::thread中获取当前线程的系统id
std::thread不提供获取当前线程的系统id的方法,仅可以获取当前的线程id,但是我们可以通过建立索引表的方式来实现 std::mutex m; std::map<std::thread: ...
- 关于MFC资源句柄、ID和对象
一.资源.句柄和ID 资源: MFC中的资源,如菜单.对话框.图标.工具条.对话框等,是windows创建的,并占用堆内存.windows在创建这些资源时候会给每个资源分配一个句柄,用来标记这些资源, ...
随机推荐
- ionic react-native和native开发移动app那个好
ionic react-native和native开发移动app那个好 ? 移动端开发如何选型?这里介绍一下我眼中的ionic,react-native,native 三种移动端开发选型对比.欢迎大家 ...
- select 通过jq赋值
<select name="F_YSBAQLX" onchange="selectvalue()" id="lista" prompt ...
- Codeforces Round #378 (Div. 2) A B C D 施工中
A. Grasshopper And the String time limit per test 1 second memory limit per test 256 megabytes input ...
- 16年青岛网络赛 1002 Cure
题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=723 Cure Time Limit: 30 ...
- 关于配置服务器(IIS7)
服务器Server2003 ,无限开机动画慢动作重播,一怒而重装server2008 然,重点就是系统装好了 IIS装好了 ,发布网站 开始各种错了!!! 1.第一个错 额,错误信息说 :由于权限不足 ...
- c语言二叉树基本操作
编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...
- codeforces298c
link:http://codeforces.com/problemset/problem/298/C 这道题目可以看出来我智商确实拙计 #include <iostream> #incl ...
- For xml path
Select * from tb for xml path('') 特点: 1. 以xml形式展示查询数据. 2. 自定义数据展示类型. 实例: 1. Select * from tb for xml ...
- 如何让WordPress支持上传更多文件类型
如何让WordPress支持上传更多文件类型 可以在functions.php中这样写: 1 2 3 4 5 6 7 8 9 add_filter('upload_mimes', 'wpdit_f ...
- IOS5中的Safari不兼容Javascript中的Date问题
在IOS5以上版本(不包含IOS5)中的Safari浏览器能正确解释出Javascript中的 new Date('2016-06-07') 的日期对象. 但是在IOS5版本里面的Safari解释ne ...