Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Elemental Code en 13 Diciembre 2010, 21:51 pm



Título: Esperar al final de la ejecucion de otro programa.
Publicado por: Elemental Code en 13 Diciembre 2010, 21:51 pm
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

??????


Título: Re: Esperar al final de la ejecucion de otro programa.
Publicado por: Karcrack en 14 Diciembre 2010, 00:09 am
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:
Código:
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..


Título: Re: Esperar al final de la ejecucion de otro programa.
Publicado por: Elemental Code en 14 Diciembre 2010, 03:13 am
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
  1. ' Shell And Wait.
  2. ' Taken Fron VB-Helper.com
  3. '
  4. ' Edited to fit MY nedds :D
  5. ' Elemental Code ^.^
  6. Option Explicit
  7. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
  8. Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
  9. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  10.  
  11. Private Const SYNCHRONIZE = &H100000
  12. Private Const INFINITE = -1&
  13.  
  14. ' Start the indicated program and wait for it
  15. Private Sub ShellAndWait(ByVal program_name As String, ByVal window_style As VbAppWinStyle)
  16. Dim process_id As Long
  17. Dim process_handle As Long
  18.  
  19.    ' Start the program.
  20.    On Error GoTo ShellError
  21.    process_id = Shell(program_name, window_style)
  22.    On Error GoTo 0
  23.  
  24.    DoEvents
  25.  
  26.    ' Wait for the program to finish.
  27.    ' Get the process handle.
  28.    process_handle = OpenProcess(SYNCHRONIZE, 0, process_id)
  29.    If process_handle <> 0 Then
  30.        WaitForSingleObject process_handle, INFINITE
  31.        CloseHandle process_handle
  32.    End If
  33.  
  34.    'Closed Window
  35.    'Do whatever you want here :D
  36.    Exit Sub
  37.  
  38. ShellError:
  39.    MsgBox "Error starting task " & _
  40.        txtProgram.Text & vbCrLf & _
  41.        Err.Description, vbOKOnly Or vbExclamation, _
  42.        "Error"
  43. 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