[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并且关闭进程的更多相关文章

  1. CloseHandel(_beginthreadex): 只是关闭了线程句柄对象,并不会结束线程。

    今天在测试程序的时候,在[任务管理器]中发现进程序的句柄随着多线程的不断运行,会不断的 +1. 发现原来在我的代码中,启动线程后都没有显式的调用 CloseHandle() 来关闭线程句柄. 当我准备 ...

  2. 线程、线程句柄、线程ID

     什么是句柄:句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 ...

  3. 【windows 操作系统】线程句柄HANDLE与线程ID的关系

    什么是句柄 句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访 ...

  4. 线程句柄和线程ID的区别

    ●CreateThread() API 用于创建线程. API 返回同时线程句柄,并通过参数得到线程标识符 (ID). 线程句柄有完全访问权创建线程对象. 运行线程时线程 ID 唯一标识线程在系统级别 ...

  5. c++ 多线程:线程句柄可以提前关闭,但是线程并没有关闭

    很多程序在创建线程都这样写的:ThreadHandle = CreateThread(NULL,0,.....);CloseHandel(ThreadHandle );1,线程和线程句柄(Handle ...

  6. Windows中句柄和ID的区别

    写在前面:这里介绍句柄 对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚.查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以 ...

  7. C# 关闭进程的时候总是捕捉到System.Threading.ThreadAbortException: 正在中止线程

    C# 关闭进程的时候总是捕捉到System.Threading.ThreadAbortException: 正在中止线程 这是由ThreadAbortException抛出的 可以写成下面的样子 tr ...

  8. std::thread中获取当前线程的系统id

    std::thread不提供获取当前线程的系统id的方法,仅可以获取当前的线程id,但是我们可以通过建立索引表的方式来实现 std::mutex m; std::map<std::thread: ...

  9. 关于MFC资源句柄、ID和对象

    一.资源.句柄和ID 资源: MFC中的资源,如菜单.对话框.图标.工具条.对话框等,是windows创建的,并占用堆内存.windows在创建这些资源时候会给每个资源分配一个句柄,用来标记这些资源, ...

随机推荐

  1. HDU 2717 Catch That Cow (bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 Catch That Cow Time Limit: 5000/2000 MS (Java/Ot ...

  2. bootstrap-4

    html文档中,列表结构主要有三种:有序列表.无序列表和定义列表:<ul><li>.<ol><li>.<dl><dt><d ...

  3. JQUERY知识总结

    1, 让页面上某一个已存在的SELECT被选中的JQuery写法  $("#test").find("option[value='3']").prop(&quo ...

  4. Oracle学习系列6

    Oracle学习系列6 ************************************************************************************ 删除约 ...

  5. Nginx-ngx_lua模块原理和内置函数

    ngx_lua模块的原理: 1.每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM:2.将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问:3.每个 ...

  6. LINQ查询操作符之Select、Where、OrderBy、OrderByDescending、GroupBy、Join、GroupJoin及其对应的查询语法

    介绍    ·Select - Select选择:延迟    ·Where - Where查询:延迟    ·OrderBy - 按指定表达式对集合正序排序:延迟    ·OrderByDescend ...

  7. 帮朋友急招PHP、Android开发工程师 西安 工资8k-12k

    PHP高级工程师岗位要求: 1. 有两年以上PHP开发经验, 2. 精通PHP+MySQL程序设计及开发,拥有良好的代码习惯,要求结构清晰,命名规范,逻辑性强,代码冗余率低. 3. 熟悉面向对象的软件 ...

  8. .net4缓存笔记

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. 黄聪:wordpress向一个页面POST数据,出现404页面访问不了

    出现这个情况,说明POST的数据中存在一些关键词,触发调用了page以外的模版.比如POST数据中有 name , author 等参数. 解决办法,就是把这些参数改一下名称.

  10. SQL语句 DML,DDL,DCL

    数据控制语言(DCL)是用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT.DENY.REVOKE等语句,在默认状态下,只有 sysadmin.dbcreator.db_owner或d ...