Как запустить dos-прогу и отследить её завершение? (+)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

Как запустить dos-прогу и отследить её завершение? (+)

Сообщение Kundor » 22.11.2003 (Сб) 16:11

Есть такая задача - запустить dos-прогу под w98, 2K, XP, а затем продолжить работу программы после того, как пользователь эту прогу закрыл. В MSDN есть несколько методов этого дела, только для меня ни один не срабатывает. Во-первых прога запускается только коммандой ShellExecute, всеми остальными методами (CreateProcessA, Shell) - просто прётся пустая чёрная дос консоль с работой проца на 100%). А при методе ShellExecute я не нашел методов определения - закрыта dos-прога или нет. Помогите, пжалста, если кто знает... а?

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

Сообщение alibek » 22.11.2003 (Сб) 18:25

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

Public Type STARTUPINFO
  cb As Long
  lpReserved As String
  lpDesktop As String
  lpTitle As String
  dwX As Long
  dwY As Long
  dwXSize As Long
  dwYSize As Long
  dwXCountChars As Long
  dwYCountChars As Long
  dwFillAttribute As Long
  dwFlags As Long
  wShowWindow As Integer
  cbReserved2 As Integer
  lpReserved2 As Long
  hStdInput As Long
  hStdOutput As Long
  hStdError As Long
End Type

Public Type PROCESS_INFORMATION
  hProcess As Long
  hThread As Long
  dwProcessID As Long
  dwThreadID As Long
End Type

Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CreateProcessA Lib "kernel32" (ByVal _
   lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
   lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
   ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
   ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
   lpStartupInfo As STARTUPINFO, lpProcessInformation As _
   PROCESS_INFORMATION) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const INFINITE = -1&
Public Const STILL_ACTIVE = &H103&

Public Function ExecCmd(CmdLine As String) As Long
Dim ret As Long
Dim proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO
Start.cb = Len(Start)
ret = CreateProcessA(0&, CmdLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)
DoEvents
ret = WaitForSingleObject(proc.hProcess, INFINITE)
Call GetExitCodeProcess(proc.hProcess, ret)
Call CloseHandle(proc.hProcess)
ExecCmd = ret
End Function

Public Function ExecWaitCmd(CmdLine As String) As Long
Dim ret As Long
Dim proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO
Start.cb = Len(Start)
ret = CreateProcessA(0&, CmdLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)
Do
  GetExitCodeProcess proc.hProcess, ret
  DoEvents
Loop While ret = STILL_ACTIVE
Call GetExitCodeProcess(proc.hProcess, ret)
Call CloseHandle(proc.hProcess)
ExecWaitCmd = ret
End Function
Lasciate ogni speranza, voi ch'entrate.

Kundor
Новичок
Новичок
 
Сообщения: 37
Зарегистрирован: 22.11.2003 (Сб) 15:59
Откуда: Астрахань

К сожалению - не катит (+)

Сообщение Kundor » 22.11.2003 (Сб) 21:43

Я так пробовал (пример похож на MSDN-овский), досовские проги (которые я тестил) запускались таким образом нормально, НО - именно та, которая мне и нужна - выводи просто чёрный экран при
ret = CreateProcessA(0&, CmdLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, Start, proc)

как я написал в своём вопросе - мне желательно решить задачу обнаружения завершения дос-проги при запуске её посредством shellexecute. Не понимаю почему, но только таким образом она вообще запускается...
Есть ещё идеи у кого-то?

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

Сообщение Sebas » 24.11.2003 (Пн) 11:09

Windows Script HOst - библиотека
Будешь иметь доступ к чтению и записи в консоль
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


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

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

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

    TopList