Гаджет Windows 7 не выпускает объект ActiveX

Я работаю над гаджетом 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 ответа

Решение

Так работает 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

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

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

Другие вопросы по тегам