shell ждать завершения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

shell ждать завершения

Сообщение shady » 05.05.2006 (Пт) 8:20

Искал по форуму, ничего не нашел :(
Код: Выделить всё
    myFile = Dir(App.Path & "\BD\*.arj") ' - первый
' циклом прогоняем все имена файлов и распаковываем их
Do While Len(myFile) <> 0
    Shell App.Path & "\arj.exe e -y " & App.Path & "\BD\" & myFile & " " & App.Path & "\BD", vbNormalFocus
    myFile = Dir '- следующий.
Loop


вот так запускаю rar и распаковываю. При этом сразу запускается rar-ов столько же сколько и файлов с архивом.
Мне нужно: пока последний архив не распакуется НЕ выполнять код который у меня идет дальше.
Подскажите, как делать?[/b]

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 05.05.2006 (Пт) 8:28

поиск по CreateProcess и WaitForSingleObject
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 05.05.2006 (Пт) 8:31

да, попробывал уже поискать, и только что нашел на http://www.freevbcode.com/ShowCode.asp?ID=3441
спрашивал потому, что думал что возможно есть более простая альтернатива, видимо нет
теперь буду разбираться в найденном.

smaharbA
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 16.06.2005 (Чт) 5:08

Сообщение smaharbA » 05.05.2006 (Пт) 9:29

А почемубы через WScript.Shell не сделать ?
Я конечно далек от мысли...(с)

smaharbA
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 16.06.2005 (Чт) 5:08

Сообщение smaharbA » 05.05.2006 (Пт) 9:30

+
еще shell возвращает pid - можна после запуска отслеживать наличие процесса с этим pid
Я конечно далек от мысли...(с)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.05.2006 (Пт) 9:52

shady
Ты очень необычно ищешь. Наверное, ты не ищешь совсем, как я думаю. На первой же странице этого раздела (не говоря уже о десятках других топиков). http://bbs.vbstreets.ru/viewtopic.php?t=25130
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 05.05.2006 (Пт) 10:16

GSerg, я как раз это видел, просто думал что моя проблема решается проще, оказалось что нет (:.
теперь я пытаюсь решить проблему при помощи CreateProcess как написано в http://bbs.vbstreets.ru/viewtopic.php?t ... ateprocess Andrey Fedorov.
Его пример с notepad у меня работает, а вот почему-то мою строку Create Process запускать не желает, подозреваю что это из-за пробелов, но возможно и нет :(

Debug.Print strCommandLine дает вот что:
Код: Выделить всё
D:\my_work\BuPr\arj.exe e -y D:\my_work\BuPr\BD\DE0405.ARJ D:\my_work\BuPr\BD\


Код: Выделить всё
Public Function StartFile(ByRef strCommandLine As String, _
        Optional ByRef bDebug As Boolean = False, _
        Optional ByRef strCurrentDirectory As Variant, _
        Optional ByRef hStdInput As Variant, _
        Optional ByRef hStdOutput As Variant, _
        Optional ByRef hStdError As Variant) As Long
    Const WAIT_FAILED = -1, INFINITE = -1, WAIT_TIMEOUT& = &H102&
    Const CREATE_NEW_CONSOLE = &H10, DETACHED_PROCESS = &H8
   
    Dim s As String, lngDebug As Long, lngError As Long, iWait As Long
    Dim lngStdInput As Long, lngStdOutput As Long, lngStdError As Long
    Dim usrPI As PROCESS_INFORMATION, usrSI As STARTUPINFO
   
    lngDebug = IIf(bDebug, CREATE_NEW_CONSOLE, DETACHED_PROCESS)
    usrSI.cb = Len(usrSI)
    If Not IsMissing(hStdInput) Then If hStdInput > 0 Then usrSI.hStdInput = hStdInput: usrSI.dwFlags = &H100
    If Not IsMissing(hStdOutput) Then If hStdOutput > 0 Then usrSI.hStdOutput = hStdOutput: usrSI.dwFlags = &H100
    If Not IsMissing(hStdError) Then If hStdError > 0 Then usrSI.hStdError = hStdError: usrSI.dwFlags = &H100
   

    If 1 = CreateProcess(0, strCommandLine, 0, 0, 1, _
            lngDebug, 0, s, usrSI, usrPI) Then
       
        iWait = WAIT_TIMEOUT
        Do
            iWait = WaitForSingleObject(usrPI.hProcess, 20)
            DoEvents
        Loop Until iWait <> WAIT_TIMEOUT
        If iWait = WAIT_FAILED Then
            CloseHandle usrPI.hProcess
            StartFile = -1
        Else
            GetExitCodeProcess usrPI.hProcess, lngError
            CloseHandle usrPI.hProcess
            If lngError <> 0 Then StartFile = lngError
        End If
    Else
        StartFile = -1
    End If
End Function

т.е. когда начинается проверка
Код: Выделить всё
If 1 = CreateProcess(0, strCommandLine, 0, 0, 1, _
            lngDebug, 0, s, usrSI, usrPI) Then

CreateProcess веозвращает 0, и своими силами я пока не могу справиться, подскажите что можно попробывать сделать ?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.05.2006 (Пт) 10:20

shady
Текст ссылки полезно читать полностью, а не только первый приведённый в ней пример... В частности, мои мысли о том, что надо пойти в Кирпичи и узреть там Waiter.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 05.05.2006 (Пт) 10:44

GSerg, спасибо за такой полезный контрол, но я еще не очень хорошо владею VB, и код, который я увидел в Waiter для меня пока еще слишком сложен, может быть подскажите по CreateProcess?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.05.2006 (Пт) 10:46

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


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 41

    TopList