Nuevamente estuve analizando, y lei que "Eternal Idol" aconsejaba usar WaitForSingleObject en vez de GetExitCodeProcess.
Rearme el codigo pero con el GetExitCodeProcess, para que detecte cuando se termina de ejecutar y avise... y logre lo siguiente
Poner en un Modulo:
Código:
Global Const SYNCHRONIZE = &H100000
Global Const INFINITE = &HFFFFFFFF
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Sub WaitForTerm(ByVal PID As Long)
On Error GoTo Gestion_Error
'Variables locales
Dim phnd As Long
phnd = OpenProcess(SYNCHRONIZE, 0, PID)
If phnd <> 0 Then
'si en vez de INFINETE se pone la cantidad de milisegundos
'el programa si el programa no se llega a liberar, se libera solo cuando
'pasen esos milisegundos
Call WaitForSingleObject(phnd, INFINITE)
Call CloseHandle(phnd)
MsgBox "El Proceso ha Terminado", vbInformation + vbOKOnly, "Mensaje"
End If
Exit Sub
Gestion_Error:
Call MsgBox(Err.Number & ": " & Err.Description)
End Sub
Public Sub EjecutarComandoDOS(Comando As String)
Dim PID As Long
PID = Shell(Environ$("Comspec") & " /c " & Comando, vbNormalFocus)
If PID <> 0 Then
'Esperar a que finalice
WaitForTerm PID
End If
End Sub
Luego para llamarlo desde cualquier parte, lo que pueden hacer es:
Código:
Call EjecutarComandoDOS("SU COMANDO DE MS-DOS"
Quiero aclarar lo siguiente...
El codigo de "jrp01", lo que hace es:
1- Ejecuta una sentencia (una sola linea) de MS-DOS y esperar a que esta termine.
Pero... Se puede seguir utilizando el programa...
Este nuevo codigo que estoy poniendo, lo que hace es:
1- Ejecuta una sentencia (una sola linea) de MS-DOS y espera a que esta termine.
La diferencia, es que este codigo, no deja que el programa se utilice, hasta que termine de ejecutarse la sentencia...
Pero, lo que se puede hacer es, poner un tiempo para que corte solo si es que no se corto.. En ves de poner INFINITE, poner la cantidad de milisegundos que se quiere esperar...
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Nuevamente, ya estamos solucionando este tema...
Voy a seguir analizando, como enviar mas de una linea...
Y tambien por que hay veces que "se ejecuta" pero en realidad no se ejecuta, o directamente hace algo mal...