Esperar al final de la ejecucion de otro programa.

Iniciado por Elemental Code, 13 Diciembre 2010, 21:51 PM

0 Miembros y 1 Visitante están viendo este tema.

Elemental Code

HOLA :D

Estoy haciendo un downloader para probar la funcion de kInvoke de Karcrack y le queria agregar un minimelt.
Que no eliminaria el programa que estas ejecutando sino el que bajaste y ejecutaste.

Osea el downloader lo que hace es bajar un archivo, ejecutarlo y necesito que cuando termine lo elimine.

pero si lo quiero eliminar antes del final de la ejecucion explota todo.

asi que, como hago lo que en consola seria.

Start notepad.exe /wait

??????

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas

Karcrack

#1
Pues si tienes el PID del proceso lo unico que has de hacer es abrirlo con OpenProcess() usando PROCESS_QUERY_INFORMATION y con el handle ir comprabando que GetExitCodeProcess() devuelva STILL_ACTIVE ;)
Seria algo como:

dim lPID as long
dim lRet as long

lPID = shell("notepad.exe")
hProc = OpenProcess(PROCESS_QUERY_INFORMATION, false, lPID)
if hProc > 0 then
do
GetExitCodeProcess(hProc,lRet)
loop while (lRet = STILL_ALIVE)
msgbox "Has cerrado el bloc de notas"
end if


Creo que eso deberia ir, aunque aqui no tengo el IDE del VB y no puedo probarlo..

Elemental Code

#2
Ahora que ya me habias dado la puntita use gugel y salio algo al toq.

No es lo mas lindo del mundo pero funciona :D
Código (vb) [Seleccionar]
' Shell And Wait.
' Taken Fron VB-Helper.com
'
' Edited to fit MY nedds :D
' Elemental Code ^.^
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 WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

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

' Start the indicated program and wait for it
Private Sub ShellAndWait(ByVal program_name As String, ByVal window_style As VbAppWinStyle)
Dim process_id As Long
Dim process_handle As Long

   ' Start the program.
   On Error GoTo ShellError
   process_id = Shell(program_name, window_style)
   On Error GoTo 0

   DoEvents

   ' Wait for the program to finish.
   ' Get the process handle.
   process_handle = OpenProcess(SYNCHRONIZE, 0, process_id)
   If process_handle <> 0 Then
       WaitForSingleObject process_handle, INFINITE
       CloseHandle process_handle
   End If

   'Closed Window
   'Do whatever you want here :D
   Exit Sub

ShellError:
   MsgBox "Error starting task " & _
       txtProgram.Text & vbCrLf & _
       Err.Description, vbOKOnly Or vbExclamation, _
       "Error"
End Sub



EDiTO: he notado que la aplicacion mientras "espera" queda como que no responde.
a mi me sirve, si no les sirve... mala suerte :P

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas