La Web del Programador: Comunidad de Programadores
 
    Pregunta:  11694 - EJECUCION SINCRONA
Autor:  J RC
Hola a todos. Necesito saber como llamar a un programa EXE desde un formulario y esperar a que éste termine su ejecución para continuar con la ejecución de mi programa Visual Basic 5. Con la función Shell ya sé que no es posible. Gracias.

  Respuesta:  Gustavo Toro
Creas un proceso con SHELL y despues haces una llamada a la API openProcess para obtener un ProcessHandle
Lugo la esperas con WaitforSingleObject.
Ejemplo:

Private Const SYNCHRONIZE = &H100000
Const PROCESS_QUERY_INFORMATION = &H400
Const INFINITE = -1&

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Public Function EjecutarSincrono(Ruta As String) As Boolean
Dim proc_id As Long, resp As Long
On Error GoTo fuera
proc_id = Shell(Ruta, vbNormalFocus)
resp = OpenProcess(PROCESS_QUERY_INFORMATION + SYNCHRONIZE, False, proc_id)
Call WaitForSingleObject(resp, INFINITE)
EjecutarSincrono = True
Exit Function
fuera:
EjecutarSincrono = False
End Function

  Respuesta:  Juan Palma
Se puede hacer con API. El código para hacer esto lo puedes encontrar en la web de guille (http://guille.costasol.net). Ahí viene bien explicado como hacerlo.