Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Windows 7小工具未释放ActiveX对象_Javascript_Excel_Activex_Windows Desktop Gadgets - Fatal编程技术网

Javascript Windows 7小工具未释放ActiveX对象

Javascript Windows 7小工具未释放ActiveX对象,javascript,excel,activex,windows-desktop-gadgets,Javascript,Excel,Activex,Windows Desktop Gadgets,我正在开发一个Windows7小工具,它需要从excel文档中提取数据。问题是,在检索到所需的数据后,Excel进程不会卸载 以下是我在初始化函数中使用的代码: var Excel = new ActiveXObject("Excel.Application"); Excel.Visible = false; Excel.DisplayAlerts = false; var workbooks = Excel.Workbooks; var workbook

我正在开发一个Windows7小工具,它需要从excel文档中提取数据。问题是,在检索到所需的数据后,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进程吗?

我当前的计算机上没有安装Microsoft Office,但我相信您必须将
Excel.Quit()
更改为
Excel.Application.Quit()


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

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

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

//... blah ...

Excel.Quit();
Excel = null;
window.setTimeout(CollectGarbage, 10);
请注意,在调用
CollectGarbage()
之前,需要留出少量时间(此处为10ms),否则在调用函数时,变量可能尚未标记为要收集

相关支持文章:


请注意,我刚刚在一个桌面小工具中对此进行了测试,可以确认它确实从进程列表中删除了该进程。太棒了-很抱歉,我花了一段时间才开始测试,但它现在按预期工作。@Eclipse:完全没有问题:-)