Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

[SOLUCIONADO] Shell y devolución de codigos

Estas en el tema de Shell y devolución de codigos en el foro de Visual Basic clásico en Foros del Web. En una pequeña aplicación en vb6 que estoy haciendo, necesito llamar a otra aplicación externa. El problema es que shell no me devuelve el código ...
  #1 (permalink)  
Antiguo 31/05/2013, 08:22
 
Fecha de Ingreso: abril-2007
Mensajes: 99
Antigüedad: 17 años, 7 meses
Puntos: 0
Shell y devolución de codigos

En una pequeña aplicación en vb6 que estoy haciendo, necesito llamar a otra aplicación externa. El problema es que shell no me devuelve el código de salida de la aplicación externa, sino el ID del proceso. El código que uso es:

Dim CodigodeSalida As Integer
CodigodeSalida=Shell ("c:/miprogramaexterno.exe,1)
Msgbox CodigodeSalida

Y, como digo me muestra en un mensaje el ID del proceso que se ejecutó con shell, pero no el código de salida de la aplicación externa a la que llama. No he visto soluciones en la ayuda con shell. Alguna idea?
  #2 (permalink)  
Antiguo 31/05/2013, 15:13
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Shell y devolución de codigos

Podrías explicar un poco mas a que te refieres cuando dices el CODIGO DE SALIDA, ¿ Se trata de alguna respuesta del programa ?, ¿ a saber como termino ?.

Existen programas que al salir del mismo devuelven un código de error o un codigo de que termino bien ¿ te refieres a esto ?
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #3 (permalink)  
Antiguo 31/05/2013, 17:02
 
Fecha de Ingreso: abril-2007
Mensajes: 99
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Shell y devolución de codigos

Exacto, así es. Uso una aplicación externa, concretamente pdftotext.exe, para pasar de pdf a texto plano y trabajarlo en mi aplicación en vb6, y el programa devuelve 0 si todo ha ido bien y otros diferentes códigos si ha habido algún error.
  #4 (permalink)  
Antiguo 01/06/2013, 01:19
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Shell y devolución de codigos

Veras, yo tuve una necesidad similar, y te dejo aqui el código del módulo que utilizo desde hace unos años y hasta ahora funciona a la perfección.

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Private Type STARTUPINFO
  4.     cb As Long
  5.     lpReserved As String
  6.     lpDesktop As String
  7.     lpTitle As String
  8.     dwX As Long
  9.     dwY As Long
  10.     dwXSize As Long
  11.     dwYSize As Long
  12.     dwXCountChars As Long
  13.     dwYCountChars As Long
  14.     dwFillAttribute As Long
  15.     dwFlags As Long
  16.     wShowWindow As Integer
  17.     cbReserved2 As Integer
  18.     lpReserved2 As Long
  19.     hStdInput As Long
  20.     hStdOutput As Long
  21.     hStdError As Long
  22. End Type
  23.  
  24. Private Type PROCESS_INFORMATION
  25.     hProcess As Long
  26.     hThread As Long
  27.     dwProcessId As Long
  28.     dwThreadId As Long
  29. End Type
  30.  
  31. Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
  32.  
  33. Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
  34.     lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
  35.     lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
  36.     ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
  37.     ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
  38.     lpStartupInfo As STARTUPINFO, lpProcessInformation As _
  39.     PROCESS_INFORMATION) As Long
  40.  
  41.  
  42. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  43. Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
  44.  
  45. Private Const NORMAL_PRIORITY_CLASS = &H20&
  46. Private Const HIGH_PRIORITY_CLASS = &H80
  47.  
  48. Private Const INFINITE = -1&
  49.  
  50. Public Function ExecCmd(cmdline As String) As Long
  51.     Dim proc As PROCESS_INFORMATION
  52.     Dim start As STARTUPINFO
  53.     Dim ret As Long
  54.     start.cb = Len(start)
  55.     start.dwFlags = &H1
  56.     start.wShowWindow = 0
  57.     ret = CreateProcessA(0&, cmdline, 0&, 0&, 1&, HIGH_PRIORITY_CLASS, 0&, 0&, start, proc)
  58.     'Espera a que finalice la aplicación lanzada y devuelve su código de error
  59.    ret = WaitForSingleObject(proc.hProcess, INFINITE)
  60.     Call GetExitCodeProcess(proc.hProcess, ret)
  61.     Call CloseHandle(proc.hThread)
  62.     Call CloseHandle(proc.hProcess)
  63.     ExecCmd = ret
  64. End Function

En mi caso, la siguiente funcion forma parte del módulo pero fue por mi necesidad, puede servirte de ejemplo, esto es lo que debes adaptar a tu sistema:


Código vb:
Ver original
  1. Public Function ErrorDeNIF(ByVal QueNif As String) As Integer
  2.   Dim Retorno As Long
  3.   Retorno = ExecCmd("java -jar valnif.jar " & QueNif)
  4.   Select Case Retorno
  5.     Case Is = 0:  ErrorDeNIF = 0  ' Correcto
  6.    Case Is = 1:  ErrorDeNIF = 1  ' Incorrecto o no encontró valnif.jar
  7.    Case Is = -1: ErrorDeNIF = 2  ' Java no se ha ejecutado
  8.  End Select
  9. End Function

Espero te sirva tanto como a mi

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #5 (permalink)  
Antiguo 06/06/2013, 08:21
 
Fecha de Ingreso: abril-2007
Mensajes: 99
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Shell y devolución de codigos

Gracias. Funciona a la perfección. Espera a que acabe la aplicación externa y devuelve el código sin problemas. Y muy fácil de usar. Gracias

Etiquetas: codigos, shell, vb6
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:40.