Javascript Windows 7小工具未释放ActiveX对象
我正在开发一个Windows7小工具,它需要从excel文档中提取数据。问题是,在检索到所需的数据后,Excel进程不会卸载 以下是我在初始化函数中使用的代码: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
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:完全没有问题:-)