javascript - Windows 7 Aracı ActiveX nesnesini serbest bırakmıyor
Excel belgesinden veri çekmesi gereken bir Windows 7 cihazı üzerinde çalışıyorum. Sorun şu ki, gerekli verileri aldıktan sonra Excel işlemi kapanmıyor.
İlk başlatma fonksiyonumda kullandığım kod burada:
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;
Bunun tamamı bir try-catch bloğuna sarılmış durumda ve her şeyin başarılı olduğunu doğrulayabiliyorum. Tüm silme işlemleri ve null atamaları, COM nesnelerine olan referansları serbest bırakma girişimim, ancak bir şeyi kaçırıyor gibi görünüyordum. Excel işlemini zorla kapatmanın bir yolu var mı?
Cevap #1
Bu sadece Internet Explorer/JScript'in çalışma şeklidir — referanslar, çöp toplayıcı çalışana kadar bir süre tutulur. Eğer değişkeni null olarak ayarlarsanız, referans bir süre sonra çöp toplama işlemine tabi tutulmalıdır. Ayrıca, JScript ve IE'de kullanılabilen (görece belgelenmemiş) CollectGarbage() metodunu kullanarak, çöp toplanmasını zorlayabilirsiniz:
var Excel = new ActiveXObject("Excel.Application");
//... blah ...
Excel.Quit();
Excel = null;
window.setTimeout(CollectGarbage, 10);
Dikkat edin, CollectGarbage() fonksiyonunu çağırmadan önce küçük bir süre (burada 10ms) bırakmanız gerekir, aksi takdirde fonksiyonu çağırdığınızda değişken henüz toplanmak üzere işaretlenmemiş olabilir.
İlgili destek makalesi: http://support.microsoft.com/kb/266088
Cevap #2
Şu anki makinemde Microsoft Office yüklü değil, ama sanırım Excel.Quit() yerine Excel.Application.Quit() değiştirmeniz gerekiyor.
Bunun nedeni, Excel'in kendi başına Excel değil, özellikle Excel.Application olarak bir ActiveX Nesnesi şeklinde başlatılmasıdır.
