Дождаться завершения запущенного приложения
strArj = "arj.exe a Book.arj book.doc"
Call Shell(strArj)
как дождаться завершения архивации и продолжить выполнение программы?
Запускаю архиватор arj командой:
strArj = "arj.exe a Book.arj book.doc"
Call Shell(strArj)
как дождаться завершения архивации и продолжить выполнение программы?
Вообще-то так, как Вы хотите, всё и должно бы сработать:
- программа вызывает Shell и передаёт ей управление;
- Shell отрабатывает и возвращает управление программе;
- программа продолжает работу до своего завершения.
У меня всё так и работает (проверял именно Ваш пример). А у Вас не так? Если не так, то что именно происходит?
Вообще-то так, как Вы хотите, всё и должно бы сработать:
- программа вызывает Shell и передаёт ей управление;
- Shell отрабатывает и возвращает управление программе;
- программа продолжает работу до своего завершения.
У меня всё так и работает (проверял именно Ваш пример). А у Вас не так? Если не так, то что именно происходит?
У меня Shell работает АСИНХРОННО (кажется так это и должно быть), т. е. Shell сразу передает управление программе, а вызванная программа работает самостоятельно:
Делаем батник: testpause.bat в нем две строчки 1-я: echo Привет всем! > testpause.txt
2-я: pause
При запуске батника создается текстовый файл testpause.txt а внем написано Привет всем! и программа ожидает нажатия любой клавиши.
Теперь пишу
strArj = "c:\1\testpause.bat"
Call Shell(strArj)
Debug.Print "Ожидаемого не произошло:("
Если это запустить, то батник так и останется висеть, а выполнение проги пордолжится, т.е. в отладчике напишется "Ожидаемого не произошло:("
А мне надо дождаться завершения запущенного приложения.
'******************************
' 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 "Пока не закроете блокнот - это сообщение в отладчике не увидите!"
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