2011-08-30 8 views
6

私は、Excel 7ドキュメントからデータを取り出す必要があるWindows 7ガジェットを開発中です。問題は、必要なデータを取得した後にExcelプロセスがアンロードされないことです。ここでWindows 7ガジェットがActiveXオブジェクトを解放しない

は、私は私の初期化関数で使用しているコードです:

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ブロック内にラップされており、私はそれがすべて成功していますことを確認することができます。すべての削除とnull割り当てはCOMオブジェクトへの参照を解放しようとする試みですが、何か不足しているようです。 Excelのプロセスを強制的にアンロードできる方法はありますか?

答えて

6

これは、Internet Explorer/JScriptが動作する方法の1つです。—の参照は、ガベージコレクタが実行されるまで一定期間保持されます。変数nullに設定すると、参照にしばらくするとガベージコレクションされます。あなたがCollectGarbage()を呼び出す前に、時間(ここでは10ms)の少量を残しておく必要があり

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

//... blah ... 

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

注、そうでない場合:あなたはまた、(比較的文書化されていない)を使用して収集するのJScriptやIEに利用できるCollectGarbage()方法をそれを強制することができます関数を呼び出すと、その変数はまだコレクション用にマークされていない可能性があります。

関連サポート記事:私はデスクトップガジェットで今これをテストし、それがプロセスのリストからプロセスを削除し確認することができhttp://support.microsoft.com/kb/266088

+0

注意。 –

+0

恐ろしいです - 残念ながら、これは私がテストに慣れるまでには時間がかかっていましたが、今は期待どおりに動作します。 – Eclipse

+0

@Eclipse:全く問題ありません:-) –

0

現在のマシンにMicrosoft Officeがインストールされていませんが、Excel.Quit()Excel.Application.Quit()に変更する必要があります。

これは、ExcelがActiveXオブジェクト、具体的にはExcel.Applicationで初期化されており、Excelではないためです。

関連する問題