0

我的应用程序启动并自动执行 Excel:

Guid CLSID_ExcelApplication = ClsidFromProgID("Excel.Application");
Application xl = CoCreateInstance(CLSID_ExcelApplication);

现在我们要开始比赛了:

Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";

然后通常你可以.QuitExcel:

xl.Quit();

Excel 消失了。

输入用户控件

应该发生的是,如果我有代码:

Application xl = CoCreateInstance(CLSID_ExcelApplication);
xl.UserControl = false;
Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";
ws = null;
wb = null;
xl = null;

然后,当最后一个未完成的引用消失时,Excel 应该会自动关闭。来自 MSDN:

Application.UserControl 属性 (Excel)

当对象的 UserControl 属性为False时,该对象会在对该对象的最后一次编程引用被释放时被释放。如果此属性为False,Microsoft Excel 会在会话中的最后一个对象被释放时退出。

我将提请注意上面文档中的重要行:

释放会话中的最后一个对象时 Microsoft Excel 退出

.UserControl为 false 时,Excel 应该会自动终止。

.UserControl属性默认为false。但即使我强制它为false ,当会话中的最后一个对象被释放时,进程外 Excel 自动化对象也不会退出:

在此处输入图像描述

更好地崩溃

如果在自动化时出现意外异常,这将成为一个问题。通常,为了很好地摆脱 Excel,您会:

  • 使其可见,并让用户关闭它:

    xl.Visible = true;
    xl.UserControl = true; //prevent Excel from terminating when we null our reference below
    xl = null
    
  • 或致电.Quit退出:

    xl.Quit();
    xl = null;
    

除非出现灾难性问题,否则我没有机会打电话.Quit或打电话.Visible = true。在这些情况下,Excel 一直存在。在几天、几周和几个月的时间里,它有时可能意味着几十个。

当最后一个未完成的引用消失时,我能做些什么来确保 Excel 将关闭:

Application xl = CoCreateInstance(CLSID_ExcelApplication);
xl.UserControl = false;
Workbook wb = xl.Workbooks.Add();
Worksheet ws = wb.Worksheets[1];
ws.Name = "Monthly Expense Report";
ws.Cells[1,2] = "January";
ws.Ce......CRASH
4

0 回答 0