Windows 7 Gadget not releasing ActiveX object

江枫思渺然 提交于 2019-12-22 05:08:20

问题


I'm working on a Windows 7 gadget that needs to pull data from an excel document. The problem is, is that the Excel process won't unload after I've retrieved the data I need.

Here's the code I use in my initialization function:

    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;

This is all wrapped in a try-catch block and I can verify that it's all succeeding. All the deletes and null assignments are my attempt to release any references to the COM objects, but I seem to be missing something. Is there some way I can force the Excel process to unload?


回答1:


This is just how Internet Explorer/JScript works — references are held for a period of time until the garbage collector runs. The reference should be garbage collected after a while if you set the variable to null. You can also force it to be collected by using the (relatively undocumented) CollectGarbage() method available to JScript and IE:

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

//... blah ...

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

Note that you need to leave a small amount of time (10ms here) before calling CollectGarbage(), otherwise when you call the function the variable may not have been marked for collection yet.

Related support article: http://support.microsoft.com/kb/266088




回答2:


I don't have Microsoft Office installed on my current machine, but I believe you have to change Excel.Quit() to Excel.Application.Quit().

This is because Excel is initialized as an ActiveX Object, specifically Excel.Application, and not Excel by itself.



来源:https://stackoverflow.com/questions/7249465/windows-7-gadget-not-releasing-activex-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!