Ejecutar un programa con Shell y esperar a que termine en Visual Basic

Esta rutina se utiliza para lanzar una aplicación desde el Shell visual basic y esperar a que la aplicación lanzada termine para continuar con la ejecución.

Para ello se utiliza la función API OpenProcess para identificar el proceso que se ha lanzado con el Shell y se espera hasta que el proceso termine para continuar la ejecución.

En un módulo creamos el siguiente código para poder utilizar las funciones de la API:

[vb]

Option Explicit
Private Declare Function OpenProcess Lib “kernel32″ _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib “kernel32″ _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Const STATUS_PENDING = &H103&
Private Const PROCESS_QUERY_INFORMATION = &H400

[/vb]

Luego en el mismo módulo creamos la función:

[vb]
Public Function ShellandWait(ExeFullPath As String, _
Optional TimeOutValue As Long = 0) As Boolean
Dim lInst As Long
Dim lStart As Long
Dim lTimeToQuit As Long
Dim sExeName As String
Dim lProcessId As Long
Dim lExitCode As Long
Dim bPastMidnight As Boolean
On Error GoTo ErrorHandler
lStart = CLng(Timer)
sExeName = ExeFullPath
‘Deal with timeout being reset at Midnight
If TimeOutValue> 0 Then
If lStart + TimeOutValue <86400 Then
lTimeToQuit = lStart + TimeOutValue
Else
lTimeToQuit = (lStart - 86400) + TimeOutValue
bPastMidnight = True
End If
End If
lInst = Shell(sExeName, vbMinimizedNoFocus)
lProcessId = OpenProcess(PROCESS_QUERY_INFORMATION, False, lInst) 'Optenemos el ProcessID
Do 'Aqui se genera un ciclo hasta que el proceso sea distinto de pendiente, o sea, Alla terminado.
Call GetExitCodeProcess(lProcessId, lExitCode) ' Optenemos el si hay exits code o todavia esta en ejecucion (pending)
DoEvents
If TimeOutValue And Timer> lTimeToQuit Then
If bPastMidnight Then
If Timer Else
Exit Do ' Se sale del ciclo si se acavo el tiemo de espera
End If
End If
Loop While lExitCode = STATUS_PENDING
ShellandWait = True
ErrorHandler:
ShellandWait = False
Exit Function
End Function

[/vb]

Y luego llamar a la función. La podemos llamar de dos formas, con el valor opcional o sin el:

ShellandWait (text1.text,0) - espera infinitamente hasta que termine el proceso.

ShellandWait (text1.text,10000) - espera 10 seg. o el termino del proceso para salir.

[vb]

Private Sub Command1_Click()
Dim retval As Variant
retval = ShellandWait(Text1.Text)
MsgBox "HOLA"
End Sub

[/vb]
Descarga un ejemplo desde aquí.

3 comentarios en “Ejecutar un programa con Shell y esperar a que termine en Visual Basic

  1. gracias por el aporte, me fue util.
    tube que hacerle una modificacion, por lo que creo qeu es un error. El “exit function” deberia ir antes de la etiqueta, para que si el comando se ejecuto correctamente salga con true, porque sino siempre sale en falso

    quedaria asi:

    ShellandWait = True
    Exit Function’<–nueva posicion del exit
    ErrorHandler:
    ShellandWait = False
    'Exit Function <–aca no tiene sentido pues luego de esto esta el "end function"
    End Function

Los comentarios están cerrados.