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

Llamar a un .exe con parametros de entrada y salida (por linea de comando)

Estas en el tema de Llamar a un .exe con parametros de entrada y salida (por linea de comando) en el foro de Visual Basic clásico en Foros del Web. Hola me gustaría saber si alguien me puede ayudar con un problema que tengo: Necesito crear un ejecutable que llame a PL’s de Oracle, Bien ...
  #1 (permalink)  
Antiguo 22/02/2006, 08:40
Avatar de Haize25  
Fecha de Ingreso: febrero-2006
Mensajes: 4
Antigüedad: 18 años, 2 meses
Puntos: 0
Llamar a un .exe con parametros de entrada y salida (por linea de comando)

Hola me gustaría saber si alguien me puede ayudar con un problema que tengo:

Necesito crear un ejecutable que llame a PL’s de Oracle, Bien esto creo que sé como hacerlo, el problema viene que ese ejecutable lo lanzara una especie de Lanzador de tareas (hecho en java) y que se dedica a lanzar procesos y que tiene un demonio que va escuchando el ejecutable, hasta que al terminar éste ejecutable devuelve un número, el lanzador de procesos dependiendo de ese número clasificará el proceso como ejecutado correctamente o con error, el problema es que no sé como hacer que un ejecutable de VB6 devuelva algo al sistema... Por ejemplo si llamas a un ejecutable desde la línea de comando, pues este abre el formulario y hace lo que tenga que hacer, pero como hago para que devuelva algo a la línea...

Ejemplo:
Imaginaos que tengo una aplicación llamada suma, recibe dos parámetros y devuelve un resultado.
Así que si pongo en MS-DOS lo siguiente C:/suma.exe 3,4 este tiene que devolver 7
¿Esto se puede hacer con VB6?

Por que una idea que me habían dado era que un .bat llamará a mi ejecutable, el ejecutable cuando terminara el proceso que sea, escribiría en un .log, el bat estaría en un bucle leyendo del .log hasta que encontrara la respuesta y cuando la encontrara lo devolvería.

Pero la verdad es que no me parece nada estable. ¿Alguien puede ayudarme O darme otra idea?

Bueno muchas gracias y espero que me podáis ayudar...
  #2 (permalink)  
Antiguo 22/02/2006, 14:19
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años
Puntos: 2
Dim programa as string
Dim parametro as string
PROGRAMA="SUMA.EXE"
PARAMETRO="3,4"
SHELL PROGRAMA & " " &

eSPERO QUE ESTO TE SIRVA
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #3 (permalink)  
Antiguo 22/02/2006, 14:34
Avatar de Haize25  
Fecha de Ingreso: febrero-2006
Mensajes: 4
Antigüedad: 18 años, 2 meses
Puntos: 0
Gracias pero

Gracias por contestar, pero lo que yo quiero saber es que código tiene el programa suma.exe

Un saludo..
  #4 (permalink)  
Antiguo 22/02/2006, 15:52
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años
Puntos: 2
Bueno en Visual Basic para crear esta aplicación suma atravez de parametros que se le pase al ejecutarla podria ser así.

Private Sub Form_Load()
Dim separador, a, b As Integer
separador = InStr(1, Command,",", vbTextCompare)
a = Mid(Command, 1, separador - 1)
b = Mid(Command, separador + 1)
MsgBox "La suma es: " & a + b
End sub
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #5 (permalink)  
Antiguo 22/02/2006, 16:32
Avatar de Haize25  
Fecha de Ingreso: febrero-2006
Mensajes: 4
Antigüedad: 18 años, 2 meses
Puntos: 0
Casi...

Bien gracias... pero en vez de sacar el resultado de la suma por msgbox, lo que tengo que hacer es devolverlo al que lanzó el ejecutable...

En msdos sería a la línea de comando...

El proceso sería...
- se ejecuta el programa
- recibe los parametros
- hace el proceso que tenga que hacer
- Devuelve un valor RETURN o PARAMETRO DE SALIDA.
- Cierra el programa.

Las caracteristicas a tener en cuenta son que no se necesite para nada la interacción con el usuario (por esto no me vale el msgbox). Espero que alguien me pueda ayudar... pero muchas gracias..
  #6 (permalink)  
Antiguo 22/02/2006, 21:25
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
Hola te paso un modulo (igual este trabaja con un .bat) pero te puedo hacegurar que es estable

Cita:
Private Declare Function GetShortPathName Lib _
"kernel32" Alias "GetShortPathNameA" (ByVal _
lpszLongPath As String, ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject 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 TerminateProcess Lib "kernel32" (ByVal _
hProcess As Long, ByVal uExitCode As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) _
As Long

Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
(ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Const PROCESS_TERMINATE = &H1
Private Const BUFFER_LENGTH = 512
Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000

Public Function ShellDos(ByVal Cmd As String, Optional ByVal WorkingDir As String = ".", Optional ByVal STDIN As String = "") As String

Dim errflag As Long ' verwenden wir um der Fehlerbehandlungs-
' routine zu sagen, wo wir gerade sind

Dim Batfile$ ' Unser Batchfile
Dim DataFile$ ' Unser STDIN-DataFile
Dim ReplyFile$ ' Unsere Ausgabedatei
Dim t As Single ' Allgemeine Zeitabfrage
Dim l As Long ' Dateilänge
Dim Task As Long ' TaskID
Dim Result As Long ' Für Rückgabewerte aus API-Funktionen
Dim fno As Long ' Dateinummer
Dim TaskID As Long ' Task-ID des DOS-Fensters
Dim ProcID As Long ' Prozess-ID des DOS-Fensters
Dim TmpDir As String ' Temporärer Ordner
Dim tmp As String ' Temporärer String

TmpDir = String(BUFFER_LENGTH, 0)
l = GetTempPath(BUFFER_LENGTH, TmpDir)
TmpDir = Left(TmpDir, l)

ReplyFile = TmpDir & "DOSReply.txt"
DataFile = TmpDir & "DOSSTDIN.txt"

' Die Datei muss existieren, damit
' GetShortPathName Funktioniert.
fno = FreeFile
Open ReplyFile For Binary As fno: Close fno
Open DataFile For Binary As fno: Close fno
ReplyFile = ShortPath(ReplyFile)
DataFile = ShortPath(DataFile)

Cmd$ = Cmd$ & "<" & DataFile & " >" + ReplyFile
errflag = 1

' Damit das Ergebnis eindeutig ist, löschen wir erstmal die Datei
Kill ReplyFile

' Zunächst wird unser Befehl in die Batchdatei geschrieben.
Batfile$ = TmpDir & "Batch.bat"

Open Batfile$ For Output As #fno
Print #fno, RootFromPath(WorkingDir)
Print #fno, "cd " & WorkingDir
Print #fno, Cmd$
Close #fno
DoEvents

' DOS wird mit der Batchdatei aufgerufen
tmp = String(BUFFER_LENGTH, 0)
l = GetShortPathName(Batfile$, tmp, BUFFER_LENGTH)
Batfile$ = Left(tmp, l)
TaskID = Shell(Batfile$, vbHide)

DoEvents
errflag = 2

ProcID = OpenProcess(SYNCHRONIZE, False, TaskID)
Call WaitForSingleObject(ProcID, INFINITE)


terminate:
' Hier wird DOS beendet
Result = TerminateProcess(ProcID, 1&)
Result = CloseHandle(Task)

errflag = 3
l = FileLen(ReplyFile)
tmp = String(l, 0)
Open ReplyFile For Binary As fno
Get fno, , tmp
Close fno
' ANSI -> ASCII
Call OemToChar(tmp, tmp)
ShellDos = tmp


Kill Batfile
Kill ReplyFile
Kill DataFile

errflag = 4

Exit Function

err1:
Select Case Err

Case 53

Select Case errflag

Case 1
Resume Next
Case 3
ShellDos = "<ERROR>"
Exit Function
Case Else
GoTo err_else
End Select

Case Else

err_else:
MsgBox Error$

End Select
End Function

Private Function RootFromPath(ByVal Path As String) As String
RootFromPath = Mid(Path, 1, InStr(Path, ":"))
End Function

Private Function ShortPath(ByVal Path As String) As String
Dim tmp As String ' Temporärer String
Dim l As Long ' Länge des Strings

tmp = String(256, 0)
l = GetShortPathName(Path, tmp, Len(tmp))
ShortPath = Left(tmp, l)
End Function
y para llamarlo en un formulario pones un text1 un text2(multiline = true) y un command1

Cita:
Private Sub Command1_Click()
Text2 = ShellDos(Text1)
End Sub
Avisame si te sirve, un saludo
  #7 (permalink)  
Antiguo 24/02/2006, 17:21
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Para este tipo de cosas, o logras obtener los comandos que te han pasado con VB y consigues hacer que la aplicación devuelva lo que quieres, o lo haces sencillamente con C:

Código:
#include <stdlib.h>

int main(int argc, char * argv[])
{
    if(argc==3) return atoi(argv[1]) + atoi(argv[2]);
    return 0;
}
  #8 (permalink)  
Antiguo 25/02/2006, 01:55
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años
Puntos: 2
En realidad lo que quieres es que tu aplicación le pase parametros a otra y esta le debuelba una respuesta?
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #9 (permalink)  
Antiguo 25/02/2006, 03:37
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por VisualGuallabo
En realidad lo que quieres es que tu aplicación le pase parametros a otra y esta le debuelba una respuesta?
Sí, es lo que ha preguntado.

Lo normal es hacerlo en algún lenguaje que lo permita. O eso, o descubrir cómo hacer toda esa serie de pasos en VB. Pero como él mismo dice, los trucos con ".bat" ".log" y demás son cosas muy sucias y poco estables.
  #10 (permalink)  
Antiguo 03/03/2006, 10:13
 
Fecha de Ingreso: enero-2004
Mensajes: 118
Antigüedad: 20 años, 3 meses
Puntos: 0
Cita:
Iniciado por MaxExtreme
Sí, es lo que ha preguntado.

Lo normal es hacerlo en algún lenguaje que lo permita. O eso, o descubrir cómo hacer toda esa serie de pasos en VB. Pero como él mismo dice, los trucos con ".bat" ".log" y demás son cosas muy sucias y poco estables.


Has intentado con Windows Script Host, yo estoy con el mismo problema que tu, aun no he dado con la solucion. Pero te puedo contar que con este tipo de script lanzas un Shell con el comando MSDOS y despues lo instancias en una variable la cual a su vez tiene unas propiedades que son STDIN y STDOUT que hasta donde he investigado son las entradas/salidas a MSDOS, bueno seguire investigando y si logro encontrar la solucion se las haré saber

Hasta luego
  #11 (permalink)  
Antiguo 03/03/2006, 11:52
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por vats
Has intentado con Windows Script Host, yo estoy con el mismo problema que tu, aun no he dado con la solucion. Pero te puedo contar que con este tipo de script lanzas un Shell con el comando MSDOS y despues lo instancias en una variable la cual a su vez tiene unas propiedades que son STDIN y STDOUT que hasta donde he investigado son las entradas/salidas a MSDOS, bueno seguire investigando y si logro encontrar la solucion se las haré saber

Hasta luego
Eso es totalmente sucio, igual que con los .bats y .logs.

De verdad, no es tan difícil hacer algo sencillo en un lenguaje que lo permita.
  #12 (permalink)  
Antiguo 03/03/2006, 12:35
 
Fecha de Ingreso: enero-2004
Mensajes: 118
Antigüedad: 20 años, 3 meses
Puntos: 0
Cita:
Iniciado por MaxExtreme
Eso es totalmente sucio, igual que con los .bats y .logs.

De verdad, no es tan difícil hacer algo sencillo en un lenguaje que lo permita.

A que te refieres con "eso es totalmente sucio" ???
  #13 (permalink)  
Antiguo 09/03/2006, 13:18
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 5 meses
Puntos: 19
Mira, la que te tiro guallalvo, es buenisimo, no la sabia....

Pero te aconsejo que lo hagas con JAVA...

No lei todos los mensajes, pero no entendi lo que queres hacer.

Pero por lo que entendi... lo que podes hacer es usar lo que te dijo guallalvo, y agregarle lo de shell... para que llame a la otra aplicación... No se si me explico... y ala ves el shell envia el dato que queres que calcule o haga en vb...

Pero te diria qu elo hagas en java.
  #14 (permalink)  
Antiguo 26/05/2007, 23:21
 
Fecha de Ingreso: mayo-2007
Mensajes: 1
Antigüedad: 16 años, 10 meses
Puntos: 0
De acuerdo Re: Llamar a un .exe con parametros de entrada y salida (por linea de comando)

hola un saludo de antemano mira tengo un problema similar al del compañero Haize25 solo que yo kiero mandar a llamar un archivo del sistema desde visual basic el archivo es el systeminfo.exe y que toda la informacion que me genere este ejecutable la pueda visualisar en visual la verdad no tengo idea de como transaferir la informacion de este archivo exe a visual para visualizarla spero me puedas ayudar o si sabes si se puede realizar en otro lenguaje de programacion
te lo agradeceria muchisimo
  #15 (permalink)  
Antiguo 31/05/2007, 17:43
Avatar de GeoAvila
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Antigua Guatemala
Mensajes: 4.032
Antigüedad: 20 años, 4 meses
Puntos: 53
Re: Llamar a un .exe con parametros de entrada y salida (por linea de comando)

Cita:
Iniciado por MaxExtreme Ver Mensaje
Eso es totalmente sucio, igual que con los .bats y .logs.

De verdad, no es tan difícil hacer algo sencillo en un lenguaje que lo permita.
la vedad esque MaxExtreme tiene razón no es nativo del lenguaje lo cual te genera inestabilidad en cierto punto yo que vos lo haría en vb.net y solicionado el problema

nos vemos..
__________________
* Antes de preguntar lee las FAQ, y por favor no hagas preguntas en las FAQ
Sitio http://www.geoavila.com twitter: @GeoAvila
  #16 (permalink)  
Antiguo 30/08/2008, 07:12
 
Fecha de Ingreso: agosto-2008
Mensajes: 1
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Llamar a un .exe con parametros de entrada y salida (por linea de comando)

Cita:
Iniciado por MaxExtreme Ver Mensaje
Para este tipo de cosas, o logras obtener los comandos que te han pasado con VB y consigues hacer que la aplicación devuelva lo que quieres, o lo haces sencillamente con C:

Código:
#include <stdlib.h>

int main(int argc, char * argv[])
{
    if(argc==3) return atoi(argv[1]) + atoi(argv[2]);
    return 0;
}
Coincido con MaxExtreme, en C es muy sencillo
  #17 (permalink)  
Antiguo 30/08/2008, 09:35
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Llamar a un .exe con parametros de entrada y salida (por linea de comando)

Bienvenido, DarioSJ.

Se agradece tu deseo de ayudar, pero por favor, no revivas temas tan viejos.
Véase: http://www.forosdelweb.com/f40/polit...el-web-101485/

Gracias.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
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 02:55.