Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дождаться завершения запущенного приложения

2.1K
26 января 2005 года
pnvnik
40 / / 26.04.2004
Запускаю архиватор arj командой:
strArj = "arj.exe a Book.arj book.doc"
Call Shell(strArj)
как дождаться завершения архивации и продолжить выполнение программы?
405
27 января 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by pnvnik
Запускаю архиватор arj командой:
strArj = "arj.exe a Book.arj book.doc"
Call Shell(strArj)
как дождаться завершения архивации и продолжить выполнение программы?



Вообще-то так, как Вы хотите, всё и должно бы сработать:
- программа вызывает Shell и передаёт ей управление;
- Shell отрабатывает и возвращает управление программе;
- программа продолжает работу до своего завершения.
У меня всё так и работает (проверял именно Ваш пример). А у Вас не так? Если не так, то что именно происходит?

2.1K
27 января 2005 года
pnvnik
40 / / 26.04.2004
Цитата:
Originally posted by Dmitrii


Вообще-то так, как Вы хотите, всё и должно бы сработать:
- программа вызывает Shell и передаёт ей управление;
- Shell отрабатывает и возвращает управление программе;
- программа продолжает работу до своего завершения.
У меня всё так и работает (проверял именно Ваш пример). А у Вас не так? Если не так, то что именно происходит?



У меня Shell работает АСИНХРОННО (кажется так это и должно быть), т. е. Shell сразу передает управление программе, а вызванная программа работает самостоятельно:
Делаем батник: testpause.bat в нем две строчки 1-я: echo Привет всем! > testpause.txt
2-я: pause
При запуске батника создается текстовый файл testpause.txt а внем написано Привет всем! и программа ожидает нажатия любой клавиши.
Теперь пишу
strArj = "c:\1\testpause.bat"
Call Shell(strArj)
Debug.Print "Ожидаемого не произошло:("
Если это запустить, то батник так и останется висеть, а выполнение проги пордолжится, т.е. в отладчике напишется "Ожидаемого не произошло:("
А мне надо дождаться завершения запущенного приложения.

2.1K
27 января 2005 года
pnvnik
40 / / 26.04.2004
Задача решена!!!
'******************************
' API declarations (Объявляем API функции для ожидания завершения процесса
Private Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As _
Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
'******************************
'Функция WaitForProcess ожидает заданное количество милисекунд, и возвращает статус
'запущенного порцесса. Если аргумент пропущен, ждет завершение процесса.
Function WaitForProcess(taskId As Long, Optional msecs As Long = -1) _
As Boolean 'возвращает True если порцесс все еще запущен
Dim procHandle As Long
' Get the process handle.
procHandle = OpenProcess(&H100000, True, taskId)
' Check for its signaled status; return to caller.
WaitForProcess = WaitForSingleObject(procHandle, msecs) <> -1
' Close the handle.
CloseHandle procHandle
End Function

'Например, запускаем блокнот и ждем его закрытия:
WaitForProcess Shell("notepad c:\bootlog.txt", vbNormalFocus)
Debug.Print "Пока не закроете блокнот - это сообщение в отладчике не увидите!"
258
27 января 2005 года
SergeySV
1.5K / / 19.03.2003
Давно уже пользуюсь:

Код:
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long
 
Private Const INFINITE = &HFFFF
 
 
Public Sub WaitForProcessToEnd(cmdLine As String, windowstyle As VbAppWinStyle, Optional msWait As Long = INFINITE)
  ' Запускает процесс через Shell и ждет его завершения.
  '[cmdLine]     - коммандная строка, может включать имя файла, параметры, ключи
  '[windowstyle] - стиль запускаемого окна: свернутое, развернутое и т.д
  '[msWait]      - макс. время ожидания
  ' вместо конст.INFINITE можно указать время в миллисек.
  Dim retVal As Long, pID As Long, pHandle As Long
   
  pID = Shell(cmdLine, windowstyle)
  pHandle = OpenProcess(&H100000, True, pID)
  retVal = WaitForSingleObject(pHandle, msWait)
   
End Sub
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог