Гаджет 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
само собой.