elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  problemas con ejecutar cualquier archivo y esperar a que termine
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problemas con ejecutar cualquier archivo y esperar a que termine  (Leído 2,650 veces)
yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
problemas con ejecutar cualquier archivo y esperar a que termine
« en: 24 Marzo 2008, 15:56 pm »

Hola tengo unos problemas con lo siguiente:
resulta que deseo abrir un archivo X (con el programa que tenga asociado) y esperar a que este finalize para luego de ello hacer algunas cosas.

El archivo X lo abro con ShellExecute pero no puedo esperar a que termine con WaitFortSingleObject por que esta ultima api creo que espera un handle al proceso que ShellExecute no me lo da.

Lei por ahi que es mejor usar CreateProcess (que si devuelve un handle al proceso) pero esta API creo que solo abre aplicaciones (exe) y no cualquier archivo (que es mi proposito principal), intente pasarle el nombre de la aplicacion asociada (en el primer parametro con FindExecutable) pero tampoco me funciono, por ultimo probe con ShellExecuteEx que lei que si devuelve un handle al proceso que ejecuta pero si es asi no se como obtenerlo ni como juntarlo a WaitFortSingleObject.

aqui va el código
Código
  1. Const SEE_MASK_INVOKEIDLIST = &HC
  2. Const SEE_MASK_NOCLOSEPROCESS = &H40
  3. Const SEE_MASK_FLAG_NO_UI = &H400
  4. Private Type SHELLEXECUTEINFO
  5.    cbSize As Long
  6.    fMask As Long
  7.    hwnd As Long
  8.    lpVerb As String
  9.    lpFile As String
  10.    lpParameters As String
  11.    lpDirectory As String
  12.    nShow As Long
  13.    hInstApp As Long
  14.    lpIDList As Long
  15.    lpClass As String
  16.    hkeyClass As Long
  17.    dwHotKey As Long
  18.    hIcon As Long
  19.    hProcess As Long
  20. End Type
  21. Private Declare Function ShellExecuteEx Lib "shell32.dll" (SEI As SHELLEXECUTEINFO) As Long
  22.  
  23. Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
  24.      hHandle As Long, ByVal dwMilliseconds As Long) As Long
  25.  
  26.  
  27.  
  28. Private Sub Form_Load()
  29.  
  30. Dim SEI As SHELLEXECUTEINFO
  31. Dim r As Long
  32. Dim ret As Long
  33. With SEI
  34.  
  35. .cbSize = Len(SEI)
  36. .fMask = SEE_MASK_NOCLOSEPROCESS Or _
  37. SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI
  38.  
  39. .hwnd = Me.hwnd
  40. .lpVerb = "open"
  41. .lpFile = "c:\prueba.txt" '<------- el archivo que quiero abrir
  42. .lpParameters = vbNullChar
  43. .lpDirectory = vbNullChar
  44. .nShow = 1
  45. .hInstApp = 0
  46. .lpIDList = 0
  47. End With
  48.  
  49.    r = ShellExecuteEx(SEI) '<------- lo abre si,   pero no espera a que el bloc de notas se cierre
  50.  
  51.  
  52.    ret = WaitForSingleObject(SEI.hwnd, INFINITE) '<---- aqui me parece que falta algo
  53.  
  54.    MsgBox "El archvo se cerro" '<--- pues este mensaje deberia salir despues de cerrar el bloc de notas
  55. End Sub
  56.  
  57.  




En línea

yovaninu


Desconectado Desconectado

Mensajes: 349



Ver Perfil
Re: problemas con ejecutar cualquier archivo y esperar a que termine
« Respuesta #1 en: 25 Marzo 2008, 05:09 am »

a ver perdon por subir el post, pero no hay alguien que pueda ayudarme en esto?

de ser asi pues ni modo, me las tendre que arreglar yo solo, de todos modos gracias y un saludo.


En línea

cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: problemas con ejecutar cualquier archivo y esperar a que termine
« Respuesta #2 en: 25 Marzo 2008, 15:07 pm »

Código:
Option Explicit

Private Const STILL_ACTIVE                  As Long = &H103
Private Const PROCESS_QUERY_INFORMATION     As Long = &H400

Private Declare Function EnumProcesses Lib "PSAPI.DLL" (lpidProcess As Long, ByVal cb As Long, cbNeeded As Long) As Long
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
   
Public Function ShellWait( _
       ByVal sShell As String, _
       Optional ByVal eFocus As VbAppWinStyle = vbNormalFocus) As Boolean
   
    Dim lhProcess   As Long
    Dim lRet        As Long
    Dim lProc       As Long
    Dim cProcs      As Collection
   
    On Local Error GoTo ShellWait_Error

    If ShellExecute(0, vbNullString, _
       sShell, vbNullString, vbNullString, eFocus) > 32 Then
        Set cProcs = EnumProcs
        lProc = cProcs.Item(cProcs.Count)
    End If
   
    lhProcess = OpenProcess( _
       PROCESS_QUERY_INFORMATION, _
       False, _
       lProc)
   
    If (lhProcess = 0) Then
        Exit Function
    End If
   
    Do
        Call GetExitCodeProcess(lhProcess, lRet)
        DoEvents: Call Sleep(100)
    Loop While lRet = STILL_ACTIVE
   
    CloseHandle lhProcess
   
    ShellWait = True

    On Error GoTo 0
    Exit Function

ShellWait_Error:

End Function

Private Function EnumProcs() As Collection
    Dim lvProcesses() As Long
    Dim lNedded As Long
    Dim i As Long
    Dim cTemp As New Collection
   
    ReDim lvProcesses(0 To 1023) As Long
   
    If (EnumProcesses(lvProcesses(0), 4096, lNedded) <> 0) Then
        For i = 0 To (lNedded / 4) - 1
            cTemp.Add lvProcesses(i)
        Next i
    End If
    Set EnumProcs = cTemp
End Function

Edit: Modifique esta linea sShell, vbNullString, vbNullString, eFocus) >= 32 Then
« Última modificación: 25 Marzo 2008, 18:42 pm por cobein » En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines