Introducción

Cuando estas desarrollando con una tecnología obsoleta como es VB6 con grandes carencias,o que en otros casos lleva mucho mas tiempo desarrollarlo en este lenguaje que en VB.NET o por otros motivos. Es necesario poder ejecutar otro "programa" de una manera modal, en otras palabras que el programa principal se quede esperando hasta que el "programa" secundario finalice sus tareas.

|-Rutina escanear un documento.
   |- Abrir el paint con ShellAndWait(paint.exe rutaimagen) para su edición.
      |-Usuario Edita la imagen y cierra el paint.
   |- ShellAndWait finaliza y el programa continua.
|-Mandamos la imagen modificada por correo electrónico.

Parámetros o Argumentos

program_name: Indicamos el ejecutable que queremos que se ejecute.

window_style: Indicamos como queremos que sea lanzado, valores posibles del tipo VbAppWinStyle, para el caso normal vbNormalFocus.

 

Función de VB6

 
 Public Const SYNCHRONIZE = &H100000
 Public Const INFINITE = &HFFFF 
 Public Const WAIT_OBJECT_0 = 0 
 Public Const WAIT_TIMEOUT = &H102 'TIMEOUT
 
 Public Declare Function OpenProcess Lib "kernel32" _
 (ByVal dwDesiredAccess As Long, _
 ByVal bInheritHandle As Long, _
 ByVal dwProcessId As Long) _
 As Long
 Public Declare Function WaitForSingleObject Lib "kernel32" _
 (ByVal hHandle As Long, _
 ByVal dwMilliseconds As Long) _
 As Long
 Public Declare Function CloseHandle Lib "kernel32" _
 (ByVal hObject As Long) _
 As Long


'Iniciamos el programa indicado y esperamos hasta que finalice
Private Sub ShellAndWait(ByVal program_name As String, _
    ByVal window_style As VbAppWinStyle)
Dim process_id As Long
Dim process_handle As Long

    ' Iniciamos el programa
    On Error GoTo ShellError
    process_id = Shell(program_name, window_style)
    On Error GoTo 0

    DoEvents

    ' Esperamos a que finalice el programa
    ' Obtenemos el manejador del programa ejecutado.
    process_handle = OpenProcess(SYNCHRONIZE, 0, process_id)
    If process_handle <> 0 Then
        WaitForSingleObject process_handle, INFINITE
        CloseHandle process_handle
    End If
    Exit Sub
ShellError:
    'TODO AQUÍ EL CONTROL DE ERRORES SINO PUEDE ABRIR EL EJECUTABLE
End Sub

 

Llamada de Ejemplo

ShellAndWait('RUTA_AL_EJECUTABLE/EJECUTABLE,EXE PARAMETRO1 PARAMETRO2', vbNormalFocus)