shell desde VB 6

07/10/2004 - 17:25 por Miquel | Informe spam
Hola,

Tengo una aplicación en C# de Cónsola, que espara recibir un parámetro en su
Main
La aplicación devuelve siempre un número.

La llamo desde otra aplicación hecha en VB6 a través de shell, de la forma:
Dim Resultado as long
Resultado = shell(RutaAplicacionC# Parametro, vbNomalFocus)

La aplicación C# se ejecuta correctamente (porque en la ventana de consola
muestro el resultado, y este es correcto).
Pero shell, no me devuelve el numero que retorna la aplicacion c#, sino uno
que diria que es aleatorio.

alguien sabe qué estoy haciendo mal?
Grácias

Preguntas similare

Leer las respuestas

#1 Alejandro Perez
07/10/2004 - 18:25 | Informe spam
Hola Miguel. Te aseguraste que tu aplicacion en C# esta
siempre retornando el valor que debe? Intentaste llamar a
tu aplicacion de C# desde otra aplicacion .NET a ver si
recibes el valor correcto?

Si fuera asi, entonces tendriamos que ir del lado de VB6 a
ver que puede estar pasando con la funcion Shell.

Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela


Hola,

Tengo una aplicación en C# de Cónsola, que espara recibir


un parámetro en su
Main
La aplicación devuelve siempre un número.

La llamo desde otra aplicación hecha en VB6 a través de


shell, de la forma:
Dim Resultado as long
Resultado = shell(RutaAplicacionC# Parametro,


vbNomalFocus)

La aplicación C# se ejecuta correctamente (porque en la


ventana de consola
muestro el resultado, y este es correcto).
Pero shell, no me devuelve el numero que retorna la


aplicacion c#, sino uno
que diria que es aleatorio.

alguien sabe qué estoy haciendo mal?
Grácias


.

Respuesta Responder a este mensaje
#2 Miquel
07/10/2004 - 18:35 | Informe spam
Hola Alejandro, y grácias por tu tiempo

Si. La aplicación devuelve el valor correcto.
Creo, que el problema está en que Shell de VB6 (y creo que en VB.NET igual),
no devuelve el valor que retorna la aplicación llamada, sino que retorna el
identificador de la aplicación llamada.
Lo que me pregunto ahora, es cómo puedo recuperar el valor que devuelve la
aplicación llamada.



"Alejandro Perez" escribió en el mensaje
news:414f01c4ac8a$329c39a0$
Hola Miguel. Te aseguraste que tu aplicacion en C# esta
siempre retornando el valor que debe? Intentaste llamar a
tu aplicacion de C# desde otra aplicacion .NET a ver si
recibes el valor correcto?

Si fuera asi, entonces tendriamos que ir del lado de VB6 a
ver que puede estar pasando con la funcion Shell.

Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela


Hola,

Tengo una aplicación en C# de Cónsola, que espara recibir


un parámetro en su
Main
La aplicación devuelve siempre un número.

La llamo desde otra aplicación hecha en VB6 a través de


shell, de la forma:
Dim Resultado as long
Resultado = shell(RutaAplicacionC# Parametro,


vbNomalFocus)

La aplicación C# se ejecuta correctamente (porque en la


ventana de consola
muestro el resultado, y este es correcto).
Pero shell, no me devuelve el numero que retorna la


aplicacion c#, sino uno
que diria que es aleatorio.

alguien sabe qué estoy haciendo mal?
Grácias


.

Respuesta Responder a este mensaje
#3 Octavio Hernandez
07/10/2004 - 23:36 | Informe spam
Miquel,

Efectivamente, Shell devuelve un handle de instancia.
La función GetExitCodeProcess sí te dice el código de terminación del
proceso llamado (el valor que debes asociar al return de la función main()
de tu programa en C).
Prueba con este código:

****************************************************************************
****
Option Explicit

Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As
Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As
Long, lpExitCode As Long) As Long

Public Const STILL_ACTIVE = &H103
Public Const PROCESS_QUERY_INFORMATION = &H400

Public Function Ejecutar(Aplicacion As String)
Dim hProceso As Long 'Handle del proceso
Dim Activa As Long 'Valor de retorno / Estado del proceso
Dim tmp As Long

'Ejecutar la aplicacion, y quedarse con el handle (manipulador)
'del proceso, para poder controlar cuando termina
'VBNormalFocus hace que la aplicación comienze en una ventana normal
hProceso = OpenProcess(PROCESS_QUERY_INFORMATION, 0, Shell(Aplicacion,
1))

Do
'Obtiene información del proceso que iniciamos antes
tmp = GetExitCodeProcess(hProceso, Activa)

'Para que siga funcionando el sistema normalmente,
'y se ejecuten los eventos
DoEvents
Loop While Activa = STILL_ACTIVE 'Sigue activa?
Ejecutar = Activa
End Sub

Private Sub cmdEjecutar_Click()
Dim N As Long
N = Ejecutar Trim("PRUEBA.exe")
' Aquí tienes en N el valor devuelto por el EXE
End Sub

****************************************************************************
****

"Miquel" escribió en el mensaje
news:
Hola Alejandro, y grácias por tu tiempo

Si. La aplicación devuelve el valor correcto.
Creo, que el problema está en que Shell de VB6 (y creo que en VB.NET


igual),
no devuelve el valor que retorna la aplicación llamada, sino que retorna


el
identificador de la aplicación llamada.
Lo que me pregunto ahora, es cómo puedo recuperar el valor que devuelve la
aplicación llamada.



"Alejandro Perez" escribió en el mensaje
news:414f01c4ac8a$329c39a0$
Hola Miguel. Te aseguraste que tu aplicacion en C# esta
siempre retornando el valor que debe? Intentaste llamar a
tu aplicacion de C# desde otra aplicacion .NET a ver si
recibes el valor correcto?

Si fuera asi, entonces tendriamos que ir del lado de VB6 a
ver que puede estar pasando con la funcion Shell.

Alejandro Perez
MCSD/MCDBA/MCT
Caracas - Venezuela


>Hola,
>
>Tengo una aplicación en C# de Cónsola, que espara recibir
un parámetro en su
>Main
>La aplicación devuelve siempre un número.
>
>La llamo desde otra aplicación hecha en VB6 a través de
shell, de la forma:
>Dim Resultado as long
> Resultado = shell(RutaAplicacionC# Parametro,
vbNomalFocus)
>
>La aplicación C# se ejecuta correctamente (porque en la
ventana de consola
>muestro el resultado, y este es correcto).
>Pero shell, no me devuelve el numero que retorna la
aplicacion c#, sino uno
>que diria que es aleatorio.
>
>alguien sabe qué estoy haciendo mal?
>Grácias
>
>
>.
>


Respuesta Responder a este mensaje
#4 Miquel
08/10/2004 - 11:51 | Informe spam
Gràcias!
Miquel


"Octavio Hernandez" escribió en el mensaje
news:%
Miquel,

Efectivamente, Shell devuelve un handle de instancia.
La función GetExitCodeProcess sí te dice el código de terminación del
proceso llamado (el valor que debes asociar al return de la función main()
de tu programa en C).
Prueba con este código:




****************************************************************************
****
Option Explicit

Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess


As
Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess


As
Long, lpExitCode As Long) As Long

Public Const STILL_ACTIVE = &H103
Public Const PROCESS_QUERY_INFORMATION = &H400

Public Function Ejecutar(Aplicacion As String)
Dim hProceso As Long 'Handle del proceso
Dim Activa As Long 'Valor de retorno / Estado del proceso
Dim tmp As Long

'Ejecutar la aplicacion, y quedarse con el handle (manipulador)
'del proceso, para poder controlar cuando termina
'VBNormalFocus hace que la aplicación comienze en una ventana normal
hProceso = OpenProcess(PROCESS_QUERY_INFORMATION, 0, Shell(Aplicacion,
1))

Do
'Obtiene información del proceso que iniciamos antes
tmp = GetExitCodeProcess(hProceso, Activa)

'Para que siga funcionando el sistema normalmente,
'y se ejecuten los eventos
DoEvents
Loop While Activa = STILL_ACTIVE 'Sigue activa?
Ejecutar = Activa
End Sub

Private Sub cmdEjecutar_Click()
Dim N As Long
N = Ejecutar Trim("PRUEBA.exe")
' Aquí tienes en N el valor devuelto por el EXE
End Sub




****************************************************************************
****

"Miquel" escribió en el mensaje
news:
> Hola Alejandro, y grácias por tu tiempo
>
> Si. La aplicación devuelve el valor correcto.
> Creo, que el problema está en que Shell de VB6 (y creo que en VB.NET
igual),
> no devuelve el valor que retorna la aplicación llamada, sino que retorna
el
> identificador de la aplicación llamada.
> Lo que me pregunto ahora, es cómo puedo recuperar el valor que devuelve


la
> aplicación llamada.
>
>
>
> "Alejandro Perez" escribió en el mensaje
> news:414f01c4ac8a$329c39a0$
> Hola Miguel. Te aseguraste que tu aplicacion en C# esta
> siempre retornando el valor que debe? Intentaste llamar a
> tu aplicacion de C# desde otra aplicacion .NET a ver si
> recibes el valor correcto?
>
> Si fuera asi, entonces tendriamos que ir del lado de VB6 a
> ver que puede estar pasando con la funcion Shell.
>
> Alejandro Perez
> MCSD/MCDBA/MCT
> Caracas - Venezuela
>
>
> >Hola,
> >
> >Tengo una aplicación en C# de Cónsola, que espara recibir
> un parámetro en su
> >Main
> >La aplicación devuelve siempre un número.
> >
> >La llamo desde otra aplicación hecha en VB6 a través de
> shell, de la forma:
> >Dim Resultado as long
> > Resultado = shell(RutaAplicacionC# Parametro,
> vbNomalFocus)
> >
> >La aplicación C# se ejecuta correctamente (porque en la
> ventana de consola
> >muestro el resultado, y este es correcto).
> >Pero shell, no me devuelve el numero que retorna la
> aplicacion c#, sino uno
> >que diria que es aleatorio.
> >
> >alguien sabe qué estoy haciendo mal?
> >Grácias
> >
> >
> >.
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida