Отловить прерывание скрипта

Программирование на Active Server Pages и VBScript.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Отловить прерывание скрипта

Сообщение alibek » 05.09.2018 (Ср) 16:06

Есть скрипт VBS, который обрабатывает документы Word.
Создается невидимый инстанс Word (через CreateObject), загружаются документы, выполняется обработка, затем инстанс закрывается.
Выполнение скрипта может быть прервано (нажатием Ctrl+C или закрытием хоста).
Можно ли это событие перехватить, чтобы запущенный инстанс Word сделать видимым?
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Отловить прерывание скрипта

Сообщение ALX_2002 » 06.09.2018 (Чт) 14:42

alibek, приветствую ! Конечно можно ! )

Вариант 1
Код: Выделить всё
Option Explicit

Eval "new clsClass"

Class clsClass
   Private oWordApp
   
   Private Sub Class_Initialize()
      Set oWordApp = CreateObject("Word.Application")
   End Sub
   
   Private Sub Class_Terminate()
      oWordApp.Visible = True
      MsgBox "Event before close", vbInformation
      oWordApp.Quit
   End Sub
End Class


Вариант 2 (Предпочитаю его использовать)
Код: Выделить всё
Option Explicit

Dim oEvent
Dim oWordApp
Set oEvent = new clsTerminationEvent
oEvent.Attach GetRef("Script_OnTerminate")

Set oWordApp = CreateObject("Word.Application")

Sub Script_OnTerminate()
   oWordApp.Visible = True
   MsgBox "Event before close", vbInformation
   oWordApp.Quit
End Sub

Class clsTerminationEvent
   Private oEvent
   
   Sub Attach(oRef)
      Set oEvent = oRef
   End Sub
   
   Private Sub Class_Terminate()
      If isObject(oEvent) Then oEvent
   End Sub
End Class

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Отловить прерывание скрипта

Сообщение alibek » 06.09.2018 (Чт) 17:06

Контрольный пример:
Код: Выделить всё
Option Explicit

Dim i

Dim oEvent: Set oEvent = New clsTerminationEvent
oEvent.Attach GetRef("Script_OnTerminate")

For i = 1 To 100
  WScript.Echo "- " & i
  WScript.Sleep(300)
Next

Sub Script_OnTerminate()
  WScript.Echo "Выполнение скрипта прервано."
End Sub

Class clsTerminationEvent
  Private oEvent

  Sub Attach(oRef)
    Set oEvent = oRef
  End Sub

  Private Sub Class_Terminate()
    If isObject(oEvent) Then oEvent
  End Sub
End Class

При завершении скрипта через Ctrl+C скрипт просто прекращает работу, текст "Выполнение скрипта прервано." не выводится.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Отловить прерывание скрипта

Сообщение ALX_2002 » 07.09.2018 (Пт) 8:47

alibek, пардон. :roll: Неправильно понял Вашу задачу. Тогда в голову приходит вариант создания второго инстанса скрипта, который будет следить за состоянием первого и передача ему ссылки на Word.Application для отображения. Такой вариант подойдёт ?

Вообще для определения верного пути нужно уточнить несколько моментов.
1) Кто запускает скрипт - запуск по клику или запуск из некоего приложения (Если запуск из приложения и оно доступно для изменения, то можно в нём мониторить завершение)
2) Word документ править можно ? (Если да, то думаю можно вставить VBA макрос, проверяющий закрытие внешнего приложения)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Отловить прерывание скрипта

Сообщение alibek » 07.09.2018 (Пт) 9:20

Да, перепроверил — событие Class_Terminate срабатывает только при штатном завершении скрипта (завершение, Quit или исключение).
При Ctrl+C скрипт завершается сразу же.

1. Скрипт запускается вручную (из консоли). Вариант с двумя скриптами, один из которых будет следить за вторым, мне бы не хотелось использовать.

2. Нет, документ не должен меняться.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Отловить прерывание скрипта

Сообщение ALX_2002 » 07.09.2018 (Пт) 10:08

alibek, боюсь тогда остаётся 2 варианта:
1) написание ActiveX, который будет перехватывать событие завершения процесса и перед этим вызывать необходимую процедуру в скрипте. (Ну и соответственного его создание в самом начале скрипта)
2) Использование постоянной подписки на WMI. При этом отслеживающая часть скрипта может работать в фоне.

Хотя... Есть ещё третий - правка Normal.dot с добавлением VBA кода с отслеживанием закрытия. Но тоже некрасиво как-то.

P.S Хм... Если подумать, то можно в открытом Word.Application управлять VBA кодом. И динамически добавить нужный кусок кода.

Помню очень давно это делал: http://forum.script-coding.com/viewtopic.php?pid=48683#p48683

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Отловить прерывание скрипта

Сообщение alibek » 07.09.2018 (Пт) 11:30

Даже если использовать скрипт из двух частей (следящая и рабочая), как между ними передавать ссылку на Word.Application?
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Отловить прерывание скрипта

Сообщение ALX_2002 » 07.09.2018 (Пт) 11:39

alibek писал(а):Даже если использовать скрипт из двух частей (следящая и рабочая), как между ними передавать ссылку на Word.Application?


Я давно нашёл способ, но не уверен, что Вам понравится. - http://forum.script-coding.com/viewtopic.php?id=5573

А вариант с динамической добавкой VBA кода не катит ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Отловить прерывание скрипта

Сообщение alibek » 07.09.2018 (Пт) 11:52

Нет, исходные документы изменять нельзя.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Отловить прерывание скрипта

Сообщение alibek » 07.09.2018 (Пт) 11:56

ALX_2002 писал(а):Я давно нашёл способ, но не уверен, что Вам понравится. - http://forum.script-coding.com/viewtopic.php?id=5573

Действительно, сомнительный способ.
Попробую все же поискать, как можно перехватить Ctrl+C.
Тем более, что один раз по Ctrl+C у меня почему-то сработало событие завершения скрипта.
Lasciate ogni speranza, voi ch'entrate.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Отловить прерывание скрипта

Сообщение Sam777e » 07.09.2018 (Пт) 21:39

alibek писал(а):Создается невидимый инстанс Word (через CreateObject), загружаются документы, выполняется обработка, ...


А что при этом на экране? Чей фокус? Чьё это событие?
Другими словами - кому идет Ctrl+C ?

Вдруг поможет
1. http://www.script-coding.com/WSH/WScript.html#3.5.
ConnectObject

или

2. https://habr.com/post/189786/
«Многопоточность» WSH VBScript

Я не проверял.
Здоровья и удачи


Вернуться в ASP и VBScript

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList