Гаджет Windows 7 не выпускает объект ActiveX - PullRequest
6 голосов
/ 31 августа 2011

Я работаю над гаджетом Windows 7, который должен извлекать данные из документа 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 выгружаться?

Ответы [ 2 ]

6 голосов
/ 05 сентября 2011

Так работает Internet Explorer / JScript - ссылки хранятся в течение некоторого времени до запуска сборщика мусора.Ссылка должна быть мусором через некоторое время, если вы установите переменную на null.Вы также можете принудительно собрать его, используя (относительно недокументированный) метод CollectGarbage(), доступный для JScript и IE:

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

//... blah ...

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

Обратите внимание, что вам нужно оставить немного времени (10 мс здесь), прежде чемвызов CollectGarbage(), в противном случае при вызове функции переменная, возможно, еще не была помечена для сбора.

Соответствующая статья поддержки: http://support.microsoft.com/kb/266088

0 голосов
/ 05 сентября 2011

У меня не установлен Microsoft Office на моем текущем компьютере, но я считаю, что вы должны изменить Excel.Quit() на Excel.Application.Quit().

Это потому, что Excel инициализируется как объект ActiveX, а именно Excel.Application, а не Excel сам по себе.

...