zoukankan      html  css  js  c++  java
  • 根据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 = 0;
                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 = 0;
                    GetWindowThreadProcessId(t, out k);
                    System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
                    p.Kill();
                }
            }

    Path.GetFileNameWithoutExtension() //返回不具有扩展名的指定路径字符串的文件名。
    Path.GetTempFileName() //创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径

  • 相关阅读:
    C++11常用特性的使用经验总结
    Websocket协议的学习、调研和实现
    高性能后台服务器架构设计
    Linux下ping命令、traceroute命令、tracert命令的使用
    docker-4-Dockerfile配置文件详解
    Docker 国内仓库和镜像
    centos7.0查看IP
    tomcat报错:This is very likely to create a memory leak问题解决
    windows 环境下搭建docker私有仓库
    Docker 修改镜像源地址
  • 原文地址:https://www.cnblogs.com/wuhuisheng/p/3232035.html
Copyright © 2011-2022 走看看