Autor Tema: Ayuda con la función Shell  (Leído 3336 veces)

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

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Ayuda con la función Shell
« en: Abril 16, 2011, 11:11:02 pm »
Hola a todos. (Nota: parece una pregunta sobre base de datos, pero no lo es, es sobre la funcion Shell)

Tengo una inquietud. Estoy haciendo un sencillo programita para hacer respaldo y restauracion de una base de datos (Firebird).

Comentario: Para el uso adecuado de respaldo y restauración de una BD Firebird a de usar el programa GBak que viene en la instalacion de Firebird. Este comando o programa permite hacer sin problemas el respaldo en caliente.


Y basta con solo crear dos botones, uno para hacer el respaldo y el otro para recuperar la bd a partir del archivo backup.
Hice esto:
En el boton Respaldo
Dim RetVal
RetVal = Shell("c:\Archivos de Programa\Firebird\Firebird_2_1\BIN\gbak -v -t -user YVANB -password miclave c:\0006.fdb c:\0006.fbk", 0)


y en el boton Restauracion:
Dim RetVal
RetVal = Shell("c:\Archivos de Programa\Firebird\Firebird_2_1\BIN\gbak -c -v -user YVANB -password miclave c:\0006.fbk c:\0006.fdb", 0)


Luego le pongo adornos. Mi duda viene aqui. Cuando mando la orden no me entero el "tiempo" que tarda en crearse o restaurarse el archivo, es decir, cuando entro a la linea RetVal = Shell.... pasa inmediatamente a la siguiente linea y RetVal ya tiene un valor que me indica que si se ejecuto GBak pero cuando veo a la par el explorador de windows el archivo se ha creado un tiempillo después, es decir, GBak se tomo un tiempito en crear el archivo y mi aplicación no se entero.
¿Hay alguna forma de saber que se completo la ejecucion del programa invocado con el Shell en VB6?
La verdad que con solo el Shell yo creo que no, solo se me ocurre hacer un artificio (como siempre).

Poner un timer y preguntar por cada ciclo si ya existe el archivo para que pueda mandar un mensaje al usuario de que el proceso se completo, mientras tanto le pondre un relojito de arena o un progressbar o un cartel de "Esperate".

Hago esto porque hay cada usuario!!!, de pronto manda la orden de backup y si se tratara de una BD de 400 megas va a tardar un tiempo en crearse el archivo y el atolondrado puede apagar la PC.

Tampoco me sirve mucho poner el valor del Shell de 0 a 1 (final del shell) porque no quiero marear al usuario con una ventana DOS.

Que opinan de la idea del timer??? o si tuvieran alguna otra mejor idea lo agradecería mucho me lo indiquen.

Abrazos


Me encuentras en YAcosta.com

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Re:Ayuda con la función Shell
« Respuesta #1 en: Abril 16, 2011, 11:44:20 pm »
Puedes consultar cada 5 segundos si el gbak.exe esta ejecutandose.
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/60.htm

Tambien puede probar este ejemplo que esta bastante bueno y si recuerdo bien creo que no utiliza timer.
http://www.leandroascierto.com.ar/foro/index.php?topic=547.0

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ayuda con la función Shell
« Respuesta #2 en: Abril 17, 2011, 02:19:25 am »
Bien gracias, creo que eso me servirá. Saludos
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Ayuda con la función Shell
« Respuesta #3 en: Abril 17, 2011, 02:28:33 pm »
hola otra forma más
Código: [Seleccionar]
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 Declare Function WaitMessage Lib "user32.dll" () As Long
Private Const WAIT_TIMEOUT  As Long = &H102
Private Const SYNCHRONIZE   As Long = &H100000

Private Function ShellAndWait(ByVal ProcessName As String, Optional ByVal WindowStyle As VbAppWinStyle = vbNormalFocus, Optional ByVal bDoEvents As Boolean)
    On Error GoTo ShellError
   
    Dim lPID As Long
    Dim hProcess As Long

    lPID = Shell(ProcessName, WindowStyle)
   
    hProcess = OpenProcess(SYNCHRONIZE, 0, lPID)
    If hProcess <> 0 Then
        Do While WaitForSingleObject(hProcess, 250) = WAIT_TIMEOUT
          If bDoEvents Then
            DoEvents
            WaitMessage
          End If
        Loop
        CloseHandle hProcess
        ShellAndWait = True
    End If
   
ShellError:

End Function

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ayuda con la función Shell
« Respuesta #4 en: Abril 17, 2011, 02:38:03 pm »
Excelente Leandro, gracias. Esta forma me parece mas adecuada.

Saludos
Me encuentras en YAcosta.com

davchi

  • Bit
  • Mensajes: 9
  • Reputación: +1/-0
    • Ver Perfil
Re:Ayuda con la función Shell
« Respuesta #5 en: Febrero 25, 2012, 02:43:27 am »
Excelente FRASE "el atolondrado puede apagar la PC"

Podrias poner el codigo para ver como te ha quedado

Gracias