1

Тема: HTA JavaScript: Как правильно закрыть Excel?

Добрый день!

В HTA приложении есть такой код:

function test() 
{
    var objExcel   = new ActiveXObject('Excel.Application');

    objExcel.Application.Quit();
    objExcel.Quit();
    delete objExcel;
    objExcel = null;

}

при каждом вызове функции test() создается процесс Excel
т.е. если 10 раз вызвать эту функцию создастся 10 процесов excel

Они закроются только если закрыть приложение HTA.

Вопрос: Как убить эти процессы не закрывая HTA?

2

Re: HTA JavaScript: Как правильно закрыть Excel?

В js-скрипте у меня этот код без проблем убивает Excel на выходе. Приведи код HTA, пригодный для запуска — попробую.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: HTA JavaScript: Как правильно закрыть Excel?

Хотя нет, и без HTA можно видеть эффект:

function test() 
{
    var objExcel   = new ActiveXObject('Excel.Application');

    //objExcel.Application.Quit();
    objExcel.Quit();
    //delete objExcel;
    objExcel = null;

}
test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(20000);

Процессы вроде как торчат в памяти до завершения скрипта. Интересно...

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

4

Re: HTA JavaScript: Как правильно закрыть Excel?

Однако, вот так наглядно видно, что никаких проблем нет:

Function test()
    Set objExcel = CreateObject("Excel.Application")
    WScript.Sleep 2000
    objExcel.Quit
    Set objExcel = Nothing
End Function

test
test
test
test
test

WScript.Sleep 20000

VBScript — лучший .

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5

Re: HTA JavaScript: Как правильно закрыть Excel?

volkov888 пишет:

Добрый день!

В HTA приложении есть такой код:

function test() 
{
    var objExcel   = new ActiveXObject('Excel.Application');

    objExcel.Application.Quit();
    objExcel.Quit();
    delete objExcel;
    objExcel = null;

}

при каждом вызове функции test() создается процесс Excel
т.е. если 10 раз вызвать эту функцию создастся 10 процесов excel

Они закроются только если закрыть приложение HTA.

Вопрос: Как убить эти процессы не закрывая HTA?

Тоже боролся с этой проблемой:

var excel = new ActiveXObject("Excel.Application");
var excel_file = excel.Workbooks.Open(sFullFileNameXLS);
var excel_sheet = excel.Worksheets(excel.Worksheets.Item(1).Name);
...
excel.Workbooks.Close();
excel.Application.Quit();
excel.Quit();
excel = null;
WshShell.Exec("%comspec% /c TASKKILL /F /IM EXCEL.exe /T")    // контрольный в голову нах...

%)

6 (изменено: NikR, 2009-05-15 21:45:59)

Re: HTA JavaScript: Как правильно закрыть Excel?

И все процессы Excel убьются нах, даже те, что не надо трогать.
Зачем создавать столько объектов Excel?

7

Re: HTA JavaScript: Как правильно закрыть Excel?

NikR пишет:

И все процессы Excel убьются нах, даже те, что не надо трогать.

Да - есть такой недостаток.

8

Re: HTA JavaScript: Как правильно закрыть Excel?

Исключительно для Excel можно использовать библиотеку AutoItX3.dll (использован оригинальный код из поста #3):

function test() 
{
    var objExcel   = new ActiveXObject('Excel.Application');
    WScript.Sleep(2000);
    var Hwnd       = objExcel.Hwnd;
    var PID        = objAutoItX.WinGetProcess("[HANDLE:" + Hwnd.toString(16) + "]");

    objExcel.Quit();
    //delete objExcel;
    objExcel = null;

    objAutoItX.ProcessClose(PID);
}

var objAutoItX = new ActiveXObject("AutoItX3.Control");

test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(10000);

9

Re: HTA JavaScript: Как правильно закрыть Excel?

Р-рррр… Я же помню, что читал об этом несколько лет назад: PRB: COM Objects Created in JScript Not Released Immediately и, применительно непосредственно к Excel: BUG: Excel Does Not Shut Down After Calling the Quit Method When Automating from JScript.

Используя код из поста #3:

function test() 
{
    var objExcel   = new ActiveXObject('Excel.Application');

    //objExcel.Application.Quit();
    objExcel.Quit();
    //delete objExcel;
    objExcel = null;
    WScript.Sleep(500);
    CollectGarbage();

}
test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(2000);
test();
WScript.Sleep(10000);

10

Re: HTA JavaScript: Как правильно закрыть Excel?

Вообще непонтно, зачем создавать столько объктов. Нужно создать 1 глобальный и пользовать.