Exe de Visual Foxpro no devuelve parámetro cuando se ejecuta desde PHP con Exec()

723 views
Skip to first unread message

Józef Franciszek Marcinkiewicz

unread,
Feb 9, 2016, 3:52:41 AM2/9/16
to Comunidad de Visual Foxpro en Español
Buenos días a todos,
Tengo un programa en Vfp muy complejo que me calcula descuentos de artículos a partir de enviarle ciertos parámetros. Ahora necesito preguntar por  esos descuentos pero en contexto web, en este caso PHP.

He probado la función Exec() de PHP que ejecuta programas externos y admite devolución de parámetros,teóricamente el parámetro que devuelve el programa o lo que se imprima desde éste (p.ej print en Python)

He probado desde el programa de Vfp con:
  • \\ 22
  • ? 22
  • return 22
Pero PHP no recibe nada. He hecho un programa tonto con Python y con un simple print ("22") se consigue.

¿Alguien tiene experiencia en algo parecido? ¿Como se puede devolver un parámetro desde un exe de VFP cuando es llamado desde otro programa?

Gracias de antemano a todos.

Saludos,




Fernando D. Bozzo

unread,
Feb 9, 2016, 4:11:05 AM2/9/16
to Comunidad de Visual Foxpro en Español
Hola Josef:

Es bastante imprecisa la explicación de cómo llamás al programa de FoxPro, y crea muchas dudas, por ejemplo:

¿Estás intentando ejecutar un EXE de Fox con el comando Exec() de PHP? ==> Espero que no, porque Fox no devuelve datos de esta forma

¿Estás usando un componente COM+ (DLL) que instanciás dentro del PHP? ==> No parece que lo estés haciendo, aunque sería lo recomendable

¿Estás intentando ejecutar un programa de Fox (PRG) de alguna forma?

Como te digo, demasiadas imprecisiones.

Józef Franciszek Marcinkiewicz

unread,
Feb 9, 2016, 5:10:55 AM2/9/16
to Comunidad de Visual Foxpro en Español
Hola Fernando,
Es verdad, disculpa por la imprecisión.
Efectivamente era la opción 1 y por todas las pruebas que hecho suponía que no se podía.
La opción 2 desconocía. No tengo mucha experiencia en FoxPro la verdad.Me parece muy interesante y por ahí voy a tirar.Agradezco mucho la pista. 

Gracias de nuevo.

Saludos,

Victor Espina

unread,
Feb 9, 2016, 9:41:00 AM2/9/16
to Comunidad de Visual Foxpro en Español
El punto importante a entender aqui es que la funcion EXEC() de PHP devuelve la salida que el programa ejecutado haya enviado a la consola (STDOUT).  Perl, C, .NET, todos pueden escribir a la consola, pero VFP no.  Los comandos ?, ?? de VFP envian la salida hacia la ventana que este activa en VFP en ese momento, o al _SCREEN en su defecto; nunca a la consola.

Hace un tiempo estuve buscando la forma de escribir en la consola desde VFP y la verdad no encontre nada util.

Creo que la solucion para ti seria crear una MTDLL e instanciar la clase desde PHP.  De esa forma puedes invocar tu codigo en forma de un metodo y devolver el valor que necesitas sin proiblema.

Saludos

Victor

Fernando D. Bozzo

unread,
Feb 9, 2016, 9:52:25 AM2/9/16
to publice...@googlegroups.com
Como dice Vistor, por defecto VFP no envia nada a STDOUT, pero eso se puede habilitar para que sí devuelva algo.
De hecho, la salida STDOUT es usada por FoxBin2Prg para permitir que otros programas puedan tomar decisiones de automatización.

Por ejemplo, con un form "tst.scx", la ejecución desde DOS sería algo así:

foxbin2prg.exe "tst.scx" "0" "0" "0" "0" | find "" /v

Y la salida a STDOUT, que se va generando en tiempo real, podría devolver algo así:

I,P1,E0,S1,X0,c:\desa\test\tst.scx
O,P1,E0,S1,X0,c:\desa\test\tst.sc2


Por si a alguien le interesa, dentro del código de FoxBin2Prg hay un método "stdOut" que se encarga de enviar un texto a esa salida.
También se puede hacer lo mismo con ErrOut.


Saludos.-

Victor Espina

unread,
Feb 9, 2016, 10:08:11 AM2/9/16
to Comunidad de Visual Foxpro en Español
Excelente fernando!! Ya lo voy a probar!

Victor

Victor Espina

unread,
Feb 9, 2016, 10:58:46 AM2/9/16
to Comunidad de Visual Foxpro en Español
Intente esto sin exito:


#DEFINE stdout -11
#DEFINE errout -12
#DEFINE crlf CHR(13)+CHR(10)

*-- Funciones para escribir en StdOut
DECLARE INTEGER
'GetStdHandle' IN WIN32API AS _GetStdHandle INTEGER nHandleType
DECLARE INTEGER
'WriteFile' IN WIN32API AS _WriteFile INTEGER hFile, STRING @ cBuffer, INTEGER nBytes, INTEGER @ nBytes2, INTEGER @ nBytes3

LOCAL loException
as Exception, lcOutput, lnOutHandle, lnBytesWritten, lnOverlappedIO
lcOutput
= "Hello World!" + crlf
lnOutHandle
= _GetStdHandle(-11) && CAPTURAR STDOUT DESDE CONSOLA: FOXBIN2PRG.EXE PARAMS | FIND /V ""
lnBytesWritten
= 0
lnOverlappedIO
= 0
_WriteFile
(lnOutHandle, @lcOutput, LEN(lcOutput), @lnBytesWritten, @lnOverlappedIO)
MESSAGEBOX
("BytesWritten: " + STR(lnBytesWritten))



Al compilarlo y ejecutarlo, nada aparece en la consola y el messagebox indica en lnBytesWritten es cero.

Que estoy haciendo mal?


Victor


El martes, 9 de febrero de 2016, 11:52:25 (UTC-3), Fernando D. Bozzo escribió:

Fernando D. Bozzo

unread,
Feb 9, 2016, 11:03:14 AM2/9/16
to publice...@googlegroups.com

Victor, ¿cómo estás ejecutando exactamente tu EXE desde la consola?

Fijate que en el ejemplo que puse de FoxBin2Prg, al final puse un pipe de DOS y el find ""  /v, que es lo que permite obtener la salida de stdout que genera Fox y mandarlo a la consola

Józef Franciszek Marcinkiewicz

unread,
Feb 9, 2016, 11:06:24 AM2/9/16
to Comunidad de Visual Foxpro en Español
Buenas Victor,
Muchas gracias. Llevo un rato intentando crear esa dll con este link pero no obtengo resultado. Al registrar la DLL generada desde VFP en el componente me da error

¿Algún ejemplo a mano ?Muchas gracias.

Saludos,
errorCOM.jpg

Juan de Dios Corrales Leal

unread,
Feb 9, 2016, 11:08:52 AM2/9/16
to Comunidad de Visual Foxpro en Español
Y para que complicarse, por que no tirar por la tangente y simplemente en VFP devolver el resultado EN UN ARCHIVO DE TEXTO y ese archivo de texto leerlo con PHP ???

Digo.... no es menos complicado, que meterse con COM+ o con la consola ??

Saludos ojala te sirva.

Fernando D. Bozzo

unread,
Feb 9, 2016, 11:17:42 AM2/9/16
to publice...@googlegroups.com

Hola Josef:

Cuando metes el código del ejemplo de la clase math en un prg,  a este lo pones en un proyecto llamado myproject.pjx y lo compilas como DLL, VFP automáticamente lo compila y registra. Si ese paso de compilación no te da error,  entonces quiere decir que deberías poder instanciar tu clase con

ox = CREATEOBJECT("MyProject.Math")

¿Eso te da error?

Fernando D. Bozzo

unread,
Feb 9, 2016, 11:23:05 AM2/9/16
to publice...@googlegroups.com

Juan, hacer un proceso que tenga que hacer archivos de texto para devolver respuestas, es lo más ineficiente que existe si querés una respuesta inmediata.
¿Y del lado que espera la respuesta que haces? ¿Meter un bucle que verifique todo el tiempo si se creó ese archivo, mientras usa el 100% de la CPU?

¿Para llamar a una función que preferís, llamarla con sumar(valores) o dejar archivos de texto por el disco? ¿Qué crees que va más rápido?

Józef Franciszek Marcinkiewicz

unread,
Feb 9, 2016, 11:51:25 AM2/9/16
to Comunidad de Visual Foxpro en Español
Hola Fernando,
Gracias por responder.He compilado como dll y no me ha dado error.Después he hecho una prueba instanciandolo desde VFP con CREATEOBJECT y funciona bien.
Ahora bien, las pruebas las debo hacer en otro servidor y es allí donde estoy instalando el Component y es entoinces cuando me da el error.En este servidor está instalado el runtime de VFP.Gracias.

Saludos,

Victor Espina

unread,
Feb 9, 2016, 11:56:03 AM2/9/16
to Comunidad de Visual Foxpro en Español
Ah ok, eso era lo que faltaba.  Sin pasar la salida al FIND no obtienes nada.  Una vez hecho el pipe con el FIND efectivamente obtuve la salida... no es como lo hubiera querido, pero algo es algo.

Saludos

Victor

Victor Espina

unread,
Feb 9, 2016, 12:01:24 PM2/9/16
to Comunidad de Visual Foxpro en Español
Asegurate de tener los archivos del runtime de VFP en el servidor donde estas usando el DLL.  El error que estas obteniendo parece indicar que no estan encontrando las librerias de VFP para poder acceder al DLL.

Victor

Józef Franciszek Marcinkiewicz

unread,
Feb 9, 2016, 12:37:04 PM2/9/16
to Comunidad de Visual Foxpro en Español
Buenas Victor,
El error me da con el runtime instalado. He mirado en el visor de eventos y me da este error:

Archivo Comsvcs.dll, versión: ENU 2001.12.8531.19062 shp durante el registro de componentes. No se pueden validar los puntos de entrada del archivo DLL

¿Alguna pista?Gracias.

Saludos,

Fernando D. Bozzo

unread,
Feb 9, 2016, 1:12:51 PM2/9/16
to Comunidad de Visual Foxpro en Español
Hola Josef:

Antes que nada, ¿que tipo y versión de Windows tenés en el Servidor?

Por otro lado, fijate que para el soporte de Fox (VFP 9) necesitás no solo instalar los runtimes (vfp9r.dll y vfp9renu.dll como mínimo) en el directorio \Program Files\Microsoft Shared\VFP (no en el System32!), sino que además es necesario el runtime del Visual C++ 7.1 (msvcrt71.dll creo que se llama), y este sí va en el system32, o en el SysWow64 si es un Windows de 64 bits

Con todo eso, recién podés registrar tu DLL con \Windows\System32\regsvr32 myproject.dll (en 32 bits) o con \Windows\SysWow64\regsvr32 myproject.dll (en 64 bits)


Saludos.-

Józef Franciszek Marcinkiewicz

unread,
Feb 10, 2016, 3:41:03 AM2/10/16
to Comunidad de Visual Foxpro en Español
Buenas Fernando,
He probado en otro servidor y me ha añadido correctamente el componente. Durante el día lo probaré desde PHP. ¡Gracias!

Saludos,

Ernesto

unread,
Feb 11, 2016, 10:32:44 AM2/11/16
to Comunidad de Visual Foxpro en Español
Creo que hay una del de los runtime que sirve para los componentes, no recuerdo en este momento el nombre exacto pero. Va algo así como vfp9t.dll esa se usa para distribuir componentes com

Fernando D. Bozzo

unread,
Feb 11, 2016, 10:40:00 AM2/11/16
to publice...@googlegroups.com
Tanto la vfp9r.dll como la vfp9t.dll sirven para crear componentes, la diferencia es que la terminada en "t" es para multithreading y la otra es para un único uso.

Saludos.-

Jean Pierre Adonis De La Cruz Garcia

unread,
Feb 11, 2016, 10:52:02 AM2/11/16
to Comunidad de Visual Foxpro en Español
Hace poco tiempo tuve un problema asi, cuando quise desarrollar un proceso en PHP, no se podia, era limitado, o quizas estaba restringido, pero tenia mi modulo que funcionaba bien en Foxpro, pero no me levtanaba en modo WEB PHP, asi que migre mi modulo a Visual Basic, y ya pude ejecutar mi proceso con el EXEC de PHP, y no tengo ningun problema.
Quizas la verdad es que debas de migrar ese proceso a otro lenguaje, en este caso el VB6 me ha sido de mucha ayuda.

Fernando D. Bozzo

unread,
Feb 11, 2016, 10:58:55 AM2/11/16
to publice...@googlegroups.com

No sé para qué tanta migración a VB cuando una DLL Fox puede retornar parámetros con valores por referencia, o incluso un parámetro string con un XML,  pero eso si,  no como retorno de método.

Jean Pierre Adonis De La Cruz Garcia

unread,
Feb 11, 2016, 4:11:26 PM2/11/16
to Comunidad de Visual Foxpro en Español
Fernando, sera por que cada vez que quise hacerlo con un DLL, tenia muchos problemas, no me fncionaba, y cuando lo ponia en un servidor web, debia poner varios archivo Runtime, que al final los bloqueaban, es decir no se puede hacer en servidores externos, a menos que sea dedicado.

Juan de Dios Corrales Leal

unread,
Feb 12, 2016, 1:47:34 PM2/12/16
to Comunidad de Visual Foxpro en Español
Espero no me lo tomes a mal, no es con afan de ofender, pero tal parece que no te agrada que los demas propongamos soluciones un poco diferentes a tu forma de pensar.

Reitero: no es con afan de ofender, tomalo como una critica constructiva.

Saludos.

Fernando D. Bozzo

unread,
Feb 12, 2016, 1:57:36 PM2/12/16
to Comunidad de Visual Foxpro en Español
Hola Juan,

No me lo tomo a mal, para nada, además Jean Pierre fundamenta lo que comentó, lo cuál me parece excelente, ya que este es un foro técnico y eso se aprecia.

Espero que no te haya molestado mi observación sobre los archivos de texto, pero te fundamenté por qué no es conveniente.


Saludos.-

Józef Franciszek Marcinkiewicz

unread,
Feb 16, 2016, 11:42:08 AM2/16/16
to Comunidad de Visual Foxpro en Español
Buenas tardes a todos,
Lo primero muchas gracias a todos por responder, en especial a Fernando.
Hice la prueba en el servidor que si me dejó añadir el componente con un programa sencillísimo y me funcionó! Ahora me toca probar con el programa real.

Gracias de nuevo.

Saludos,

joaquinlr lopez

unread,
May 16, 2016, 3:41:44 PM5/16/16
to Comunidad de Visual Foxpro en Español
Josef

Puedes informarnos como te fue , que problemas tuviste y como resolviste.

Saludos.
 
Reply all
Reply to author
Forward
0 new messages