Weboldal keresés

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.