Windows 7小工具未释放ActiveX对象

6
我正在开发一个需要从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块中,我可以验证它们都成功了。所有的删除和null赋值都是为了释放对COM对象的引用,但似乎我漏掉了某些东西。有没有办法强制Excel进程卸载?
2个回答

6

这就是Internet Explorer/JScript的工作方式,引用会在一段时间内被保留直到垃圾收集器运行。如果将变量设置为null,该引用应该在一段时间后被垃圾回收。您也可以使用相对不常见的CollectGarbage()方法来强制进行回收,该方法可用于JScript和IE:

var Excel = new ActiveXObject("Excel.Application");

//... blah ...

Excel.Quit();
Excel = null;
window.setTimeout(CollectGarbage, 10);

请注意,在调用 CollectGarbage() 函数之前需要留出一小段时间(这里是10毫秒),否则当您调用该函数时,变量可能还没有被标记为可回收。

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


请注意,我刚刚在桌面小工具中测试了这个功能,并确认它确实可以将进程从进程列表中移除。 - Andy E
很棒!抱歉我花了点时间来测试,但现在它已经按预期工作了。 - Eclipse
@Eclipse:完全没有问题 :-) - Andy E

0

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

这是因为Excel被初始化为一个ActiveX对象,具体来说是Excel.Application,而不仅仅是Excel本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接