[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. C# 多线程写文件,时常写不成功

    在项目中,做一个文本日志功能 为了不影响页面响应速度,所以使用了多线程,在测试的时候,风险文件写入时常不成功,经过一番周折, 发现th.IsBackground = true;后台线程不为主线程的子线 ...

  2. cornerstone忽略显示.DS_Store文件

    在MacOS上使用svn工具时,经常发现变化列表里出现一堆的?文件,.DS_Store,对有强迫症的人来说很郁闷.处理起来很简单,就是在svn的配置里忽略这个文件.#ue ~/.subversion/ ...

  3. hdu4671 Backup Plan ——构造题

    link:http://acm.hdu.edu.cn/showproblem.php?pid=4671 其实是不难的那种构造题,先排第一列,第二列从后往前选. #include <iostrea ...

  4. yii使用MongoDB作为数据库服务软件[win7环境下](2)

    11.测试php连接并对mongodb进行简单的操作,下载RockMongo对应的数据库管理软件放到webserver软件相关的目录下,例如: 12.打开对应的url[你还可以接着对数据库进行相应的操 ...

  5. archlinux 学习笔记

    磁盘规划 cfdisk 格式化分区 mkfs.ext4 /dev/sda1 mkswap /dev/sda5 mkfs.ext4 /dev/sda6 挂载根分区和boot分区,并建立家目录 mount ...

  6. Vmvare下Ubuntu安装Python3.4

    Ubuntu14.4下默认安装的Python版本是2.7.随着Python3.4的使用,现在大部分Python开发者都喜欢使用Py3.4.那么Ubuntu下应该怎么安装Python3.4呢? (1). ...

  7. CMD规范

    define(function (require, exports, module) { module.exports = require('xx/xx/xx')({}); });

  8. 【C】 03 - 数据类型

    程序说到底就是对数据的处理,所以首先要弄清楚需要处理哪些数据,计算机如何存储这些数据.C语言根据需要,抽象出了一些基本数据类型和衍生数据类型.这些可以满足大部分需求,更复杂的抽象数据类型亦可通过它们来 ...

  9. node_nibbler:自定义Base32/base64 encode/decode库

    https://github.com/mattrobenolt/node_nibbler 可以将本源码复制到自己需要的JS文件中,比如下面这个文件,一个基于BASE64加密请求参数的REST工具: [ ...

  10. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...