Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/05/2006, 06:43
Avatar de culd
culd
 
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 5 meses
Puntos: 19
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...