javascript - Windows 7 minialkalmazás nem engedi el az ActiveX objektumot
Egy Windows 7 gadgeten dolgozom, amelynek az Excel dokumentumból kell adatot lekérnie. A probléma az, hogy az Excel folyamat nem záródik be, miután lekértem a szükséges adatokat.
Itt van a kód, amit az inicializációs függvényemben használok:
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;
Ez mind egy try-catch blokkba van csomagolva, és ellenőrizni tudom, hogy minden sikerül. Minden törlés és null értékadás a próbálkozásom, hogy felszabadítsak minden hivatkozást a COM objektumokra, de úgy tűnik, valamit kihagyok. Van valamilyen módja annak, hogy kényszerítsem az Excel folyamatot a leállításra?
Válasz #1
Ez egyszerűen az, ahogyan az Internet Explorer/JScript működik — a hivatkozásokat egy ideig tartják, amíg a szemétgyűjtő nem fut le. A hivatkozást el kellene gyűjteni a szemétgyűjtőnek egy idő után, ha a változót null-ra állítja. Agyanakkor kényszerítheti a gyűjtést a (viszonylag nem dokumentált) CollectGarbage() metódussal, amely elérhető a JScript és az IE számára:
var Excel = new ActiveXObject("Excel.Application");
//... blah ...
Excel.Quit();
Excel = null;
window.setTimeout(CollectGarbage, 10);
Ne feledd, hogy egy kis időt (itt 10 ms) kell hagynod CollectGarbage() meghívása előtt, különben amikor a függvényt meghívod, a változó még nem lehetett jelölve a gyűjtésre.
Kapcsolódó támogatási cikk: http://support.microsoft.com/kb/266088
Válasz #2
A jelenlegi gépemen nincs telepítve a Microsoft Office, de úgy gondolom, hogy a Excel.Quit()-et Excel.Application.Quit()-re kell cserélni.
Ennek az az oka, hogy az Excel ActiveX objektumként van inicializálva, konkrétan Excel.Application, és nem magától a Excel-től.
