【问题标题】:Windows 7 Gadget not releasing ActiveX objectWindows 7 小工具未释放 ActiveX 对象
【发布时间】:2011-11-07 03:31:19
【问题描述】:

我正在开发一个需要从 Excel 文档中提取数据的 Windows 7 小工具。问题是,在我检索到我需要的数据后,Excel 进程不会卸载。

这是我在初始化函数中使用的代码:

    var Excel = new ActiveXObject("Excel.Application");
    Excel.Visible = false;
    Excel.DisplayAlerts = false;
    var workbooks = Excel.Workbooks;
    var workbook = workbooks.Open("\\\\SERVER\\Documents\\Sample.xlsx", 0, true);
    var activesheet = workbook.ActiveSheet;
    var cell = sheet.Cells(1, 1);
    var value = cell.Value;
    document.getElementById("content").innerHTML = value;
    delete value;
    value = null;
    delete cell;
    cell = null;
    delete activesheet;
    activesheet = null;
    delete workbook;
    workbook = null;
    delete workbooks;
    workbooks = null;
    Excel.Quit();
    delete Excel;
    Excel = null;

这一切都包含在一个 try-catch 块中,我可以验证它是否全部成功。所有删除和空分配都是我尝试释放对 COM 对象的任何引用,但我似乎遗漏了一些东西。有什么方法可以强制 Excel 进程卸载?

【问题讨论】:

    标签: javascript excel activex windows-desktop-gadgets


    【解决方案1】:

    我目前的机器上没有安装 Microsoft Office,但我相信你必须将 Excel.Quit() 更改为 Excel.Application.Quit()

    这是因为 Excel 被初始化为 ActiveX 对象,特别是 Excel.Application,而不是 Excel 本身。

    【讨论】:

      【解决方案2】:

      这正是 Internet Explorer/JScript 的工作原理——引用会保留一段时间,直到垃圾收集器运行。如果您将变量设置为null,则参考应该在一段时间后被垃圾回收。您还可以使用 JScript 和 IE 可用的(相对未记录的)CollectGarbage() 方法强制收集它:

      var Excel = new ActiveXObject("Excel.Application");
      
      //... blah ...
      
      Excel.Quit();
      Excel = null;
      window.setTimeout(CollectGarbage, 10);
      

      请注意,在调用CollectGarbage()之前,您需要留出一小段时间(此处为10ms),否则当您调用该函数时,该变量可能尚未被标记为收集。

      相关支持文章:http://support.microsoft.com/kb/266088

      【讨论】:

      • 请注意,我刚刚在桌面小工具中对此进行了测试,并且可以确认它确实从进程列表中删除了该进程。
      • 太棒了 - 抱歉,我花了一段时间才开始测试,但现在可以正常工作了。
      • @Eclipse: 没问题 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多