Archivo de Clases .VCX dentro de otro ejecutable (Posible Solución)

1,076 views
Skip to first unread message

Antonio Meza

unread,
Jun 21, 2013, 2:11:45 PM6/21/13
to publice...@googlegroups.com
Estuve leyendo unos mensajes anteriores de Victor Espina y otras personas que comentan sobre el problema en VFP de tener las clases dentro de un ejecutable y luego hacer referencia a esas clases desde otro ejecutable y marca error que no se encuentra la clase.vcx o no se puede instanciar la clase.vcx, en desarrollo funciona bien pero al mover los ejecutables a otras carpetas o en otra maquina ya no funciona.

Hace tiempo quería tener un ejecutable con las clases y varios ejecutables que dependieran del anterior y me tope con el mismo problema, hace unos días volví a intentar realizar la mismas pruebas y leer mas en internet sin resultado y bueno quería poner los link donde comentan los problemas, pero como estaba de madrugada realizando pruebas me venció el sueño y no los guarde.

Haciendo prueba tras prueba, decidí ir por pasos, como cuando una PC no arranca que le voy quitando tarjetas, disco, memoria, etc para ver quien esta causando el problema, y aunque no es la solución que preferiría al menos me permite tener los ejecutables separado de la clase base, que por ejemplo ocupa unos 500kb y los ejecutables 100kb o 200kb dependiendo los controles y código que tengan incluso mas grandes que la clase, pero ya no incluyen la clase base que harían que todos estuvieran igual de pesados.

Iba a poner el código aquí pero mejor voy a limpiar el proyecto para dejarlo mas claro y ver si les puede funcionar o en base a lo que estoy haciendo y con gente mas experta en clases pueda determinar una mejor solución que de antemano la que uso me esta funcionando, para los que no usan clases se les va a dificultar un poco este tema.

Espero tener para el lunes el proyecto y un documento PDF donde voy comentando el proceso que hago y como reproducir el error que según leí en internet es el mismo que se me presento y a muchos mas, ademas de 2 posibles soluciones.

No estoy usando VCOM o DLL y otras cosas que comentaban que se podían hacer con eso, uso simples clases y código vfp.

saludos
Antonio Meza

Fernando D. Bozzo

unread,
Jun 22, 2013, 7:54:23 AM6/22/13
to publice...@googlegroups.com
Hola Antonio:

Lei tu post detenidamente, pero me resulta bastante confuso. Lo que comenzás comentando sobre los problemas de tener los VCX dentro de los EXE no lo entiendo, yo lo tengo así y no tengo ningún problema, y otros miles de programadores también, de hecho usarlo así es lo normal. ¿Podrás explicarte un poco más o poner los links donde leiste eso?

Luego se pone bastante más confuso, porque comentás que desarmaste una PC quitando las partes para buscar no se qué problema y luego hablás sobre el tamaño que te ocupan las clases y EXE que están entre los 100KB y los 50KB.... y acá ya no entiendo más nada. ¿Qué tiene que ver una cosa con la otra? Los problemas de software no se resuelven desarmando una PC... o no entendí que lo pusiste.

¿Podrías describir con más detalle qué problema tenés o qué intentás hacer?

Fidel Charny

unread,
Jun 22, 2013, 8:58:51 AM6/22/13
to publice...@googlegroups.com
A mí también me resulta confuso (o peor), pero lo de la desarmada de la PC es un metáfora. Se olvidó de enlazar la idea.

mapner

unread,
Jun 22, 2013, 9:13:28 AM6/22/13
to publice...@googlegroups.com
Fernando, creo que el mensaje es claro, la comparación con buscar un problema de hardware desarmando componentes es eso, una comparación, de hecho cuando debugeamos, no estamos buscando un Bug, o sea un bicho entre los circuitos, sino buscando un error de codificación, y para dejarlo más claro todavía, el ratón o mouse en informática es un componente de señalización y no un pequeño mamifero roedor que nos asiste en el trabajo.

http://es.wikipedia.org/wiki/Met%C3%A1fora_conceptual

Antonio intenta hacer uso de librerías vcx que han sido compiladas en un ejecutable externo al principal donde corre la aplicación.
Por lo general esto se hace declarando dichas librerías con el comando:

SET CLASSLIB TO lib.vcx IN milagro.exe ALIAS lib2 ADDITIVE

obvio que el ejecutable contenedor de la librería debe estar en un path ubicable o explícitar su ruta relativa en la declaración.

(ver la documentación http://msdn.microsoft.com/en-us/library/171hdcbd(v=vs.80).aspx)

para crear el objeto en forma programática

O = CREATEOBJECT('lib2.micontrol')

Saludos





Carlos Miguel FARIAS

unread,
Jun 22, 2013, 9:44:17 AM6/22/13
to Grupo Fox
Algo por el estilo he intentado hacer, pero con algunas limitaciones.
Con clases custom, no problem, creo un proyecto, con las clases, estas están escritas en prg (no en vcx).
Compilo los proyectos y obtengo exe o dll (según los casos).
Luego en la aplicación principal, hago SET PROCEDURE TO misClasesCustom.exe ADDITIVE
Y puedo instanciar luego objetos a partir de las clases definidas en esos exe separados.
Con las rutinas utilitarias hago lo mismo, creo un exe (que generalmente lo único que tiene un prg con las funciones definidas) y luego desde la aplicación central, SET PROCEDURE... como antes.
Con esto también puedo manejar los menues, ya que como en general no son objetos y bastante dinámicos, cada módulo agrega al principal lo propio, y tengo su gestión en otro exe por separado.

Con las visuales, el tema es que con vcx, al momento de diseñarlas las clases, si uso un buen nivel de herencia, necesito incluir en el proyecto las bibliotecas en cada uno (no logre que pudieran ir por fuera).
El tema que si estas bibliotecas las uso en exe por separado, hay problemas al hacer instancias (algo así como ya definido).
Lo que es lógico, porque hay objetos creados y estoy cargando la misma definición de clase cuando hay clases ya definidas (en un mismo exe, si se repiten las funciones, toma la última definida, pero lo hace al hacer el fxp, en exe por separado, ese descarte no se da).

Igual, si uso clases via prg, en exe separados, los exe pueden luego ser reemplazados por otros, con otra versión, y pueden ser reutilizados por diferentes aplicaciones.
Esa es mi experiencia.
Saludos: Miguel, La Pampa (RA)

Antonio Meza

unread,
Jun 22, 2013, 11:08:31 PM6/22/13
to publice...@googlegroups.com
Hola a todos!!

Disculpen por arrendarlos con el tema, pero lo que intento hacer y al parecer encontré una posible solución es lo que comenta Miguel

"Con las visuales, el tema es que con vcx, al momento de diseñarlas las clases, si uso un buen nivel de herencia, necesito incluir en el proyecto las bibliotecas en cada uno (no logre que pudieran ir por fuera)."

Hace tiempo eh querido hacer que mis clases Visuales VCX estén en un ejecutable y que en otro ejecutable no necesite compilarlas ahí dentro, si no que las tome del primero, por mas que busque en Internet todos tienen el mismo problema, en tiempo de desarrollo trabaja bien, porque busca los archivos VCX y están ahí, pero ya compilado todo, si los mueves de carpeta o de maquina te dice que la clase no se puede instanciar o crear, y es lo que voy a comentar el lunes en un PDF para ver si estoy aplicando correctamente las clases o alguien mas experto me pueda orientar o exista otra forma correcta.

En el caso de las funciones o procedimientos no hay problemas, de hecho tengo proyectos separados para compilar los archivos de funciones, de esta forma si hay un error en alguna función o necesito agregar una nueva no tengo que compilar de nuevo todos mis ejecutables que dependen de las funciones, y también con los menús  ahorra mucho tiempo y dolores de cabeza jajaja

El proyecto lo llamo con mis iniciales ampFunciones.pjx y dentro de el agrego todos los prg que tengan funciones, luego agrego el prg principal de igual nombre ampFunciones.prg y que solo tiene este código

* Funciones: Versión xxx
* Ultima Revisión: xxxx
SET PROCEDURE TO ;
          amp_funciones\AmpFunciones, ;
          amp_funciones\ampfuncion_catalogos, ;
          amp_funciones\ampfuncion_catalogos_bancos, ;
          amp_funciones\ampfuncion_catalogos_contabilidad, ;
          amp_funciones\ampfuncion_catalogos_trafico ADDITIVE
Bitácora General de Cambios
* ...
* ....
* FIN

Con esto compilo el proyecto y me genera el ampfunciones.exe y dentro de cualquier programa lo llamo simplemente así:

do ampfunciones.exe

Por lo que solo le digo al usuario que cierre por ejemplo el programa de BANCOS.EXE, remplazo el archivo ampfunciones.exe y que entre de nuevo con el error corregido o en su caso quedo peor jajaja (es un chiste)

saludos
Antonio Meza

Fernando D. Bozzo

unread,
Jun 23, 2013, 6:11:19 AM6/23/13
to publice...@googlegroups.com
Hola Antonio:

En VFP podés hacer lo mismo que el resto de lenguajes, es decir, podés tener tus clases de tipo form en unas librerías compiladas en un EXE y en otro EXE podés instanciar dichas clases, eso sí es posible. Lo que no es posible es que en otro EXE tengas forms basados en librerías que están en otro EXE, pero si tu objetivo es separar librerías, no creo que te signifique mucho problema hacer un CREATEOBJECT() y un SHOW() en vez de un DO FORM.

¿Con eso no te valdría?

Luis Maria Guayan

unread,
Jun 23, 2013, 10:25:28 AM6/23/13
to publice...@googlegroups.com
Aunque no es claro tu mensaje, creo que intentas algo que las mismas clases por portabilidad, herencia, etc. lo puedes hacer muy fácilmente incluyendolas en los distintos proyectos y generando los distintos ejecutables.

Trabajo en una empresa donde desarrollo muchas aplicaciones EXE de VFP y todas comparten las mismas librerías ya sean PRG o VCX sin ningún problema. Hablas de EXEs pesados de 100, 200 o 500 KB y eso no es nada.



Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

mapner

unread,
Jun 23, 2013, 10:30:30 AM6/23/13
to publice...@googlegroups.com
De hecho, si existe una forma de invocar formularios que esten compilados en un EXE desde otro EXE.

Supongamos que exe1 tiene compilado un formulario clientes y queremos invocarlo desde exe2, en exe1 debemos tener una función generica del tipo

Function Proxy_exe1(cCmd)

Evaluate(cCmd) && o &cCmd

Endfunc


Desde exe2 haremos lo siguiente:

Set procedure to exe1.exe ...

Do Proxy_exe1 with 'do form clientes ...'

...

O sea exe2 puede acceder a los formularios exe1 invocandolos a través de una función intermediaria...

Truco VFP

Saludos

Antonio Meza

unread,
Jun 23, 2013, 8:57:20 PM6/23/13
to publice...@googlegroups.com
Hola Don Fernando diste en el clavo como decimos acá en México, y como dice Don Luis Maria no me supe explicar, pero es eso lo que deseo hacer:

"Lo que no es posible es que en otro EXE tengas forms basados en librerías que están en otro EXE"

Básicamente es lo que quiero hacer que tome forms basados en librerías vcx que están compiladas en otro Exe.

En cuanto a los tamaños de los exe solo fueron ejemplo para hacer notar la diferencia.

Mapner, ejecutar formularios dentro de otros ejecutables también lo hago sin problema algo parecido a lo que indicas.

Hay muchas cosas que muchos programadores de VFP desconocen y que los beneficiaria mucho, no hay mucha información al respecto y mucho menos en Español, cosas que eh realizado por años aquí no eh visto sobre esos temas, y pues seria bueno tratar de explicarle a los demás como pueden ser mas productivos con sus desarrollos, y en mi caso me apoyo aquí en el foro, portalfox, libros  y otras realizando pruebas.

Se que disponemos de poco tiempo por nuestros trabajo en mi caso trato de aportar pequeñas cosas, que a algunos les a servido como idea, por ejemplo la clase DBVFP, seguro que a mas de uno le ayudo a resolver dudas o mejorar ese código.

Siempre eh creído en la idea de tener un framework propio de la comunidad así como por ejemplo Victor Espina hizo con Arturo Ramos, al primero compartir el código fuente para generar la factura electrónica en México y creo que Arturo subirlo para llevar control de versiones y cambios, espero y no de malos créditos!!! 

Sin embargo como comento VIctor E. en un correo casi nadie ha aportado nada pero sus librerías fueron de mucha ayuda para algunos, a mi por ejemplo me ayudo su código a manejar mejor las funciones y mejorar mi código en ese aspecto, de igual forma tome parte de esas funciones y también las mejore y he compartido aquí, haciendo referencia de donde iniciaron.

Ahora inicio un proyecto nuevo con FireBird y retome el problema de las clases formularios dentro de otros para hacer referencia en otros ejecutables y pues de eso se trata, de que personas con mas años de programación me ayuden a ver si lo que estoy haciendo es correcto y sirva de referencia para otros.

saludos y de verdad muchas gracias por tomarse el tiempo de leer y responder.

Antonio Meza

Fernando D. Bozzo

unread,
Jun 24, 2013, 1:15:44 PM6/24/13
to publice...@googlegroups.com
Antonio, por eso te puse lo del createobject() y el show(). ¿No te sirve eso? ¿Qué diferencia te haría?

Antonio Meza

unread,
Jun 24, 2013, 4:33:22 PM6/24/13
to publice...@googlegroups.com
Si de hecho lo uso pero marca error de que no se puede instanciar la clase porque no esta incluida en el ejecutable si no dentro de otro y hay que incluirla la clase y compilar de nuevo, bueno ya termine la primera parte del proyecto pero aun no va la parte donde esta el error, espero terminarlo para mañana, lo voy a subir en un post nuevo porque muchos no entran a leer este.

saludos y de verdad te agradezco lo puedas revisar.

Fernando D. Bozzo

unread,
Jun 24, 2013, 7:05:39 PM6/24/13
to publice...@googlegroups.com
Antonio, para instanciar una clase que está en otro EXE podés usar NEWOBJECT( "TuClase", "TuLibreria.VCX", "TuNombre.EXE" )

Saludos.-

Carlos Miguel FARIAS

unread,
Jun 25, 2013, 6:15:29 AM6/25/13
to Grupo Fox

Instanciar si se puede, lo que no se estaría pudiendo hacer es subclasear. O sea tengo la clase base en un exe, luego en otro proyecto, exe, crear una subclase de la otra clase.
Eso intente y no funcionó (al menos a mi), ya que automáticamente, al compilar, incluye la clase principal (este en prg o vcx).
La única que queda es componer en un exe o crear instancias super parametrizables, y como se hace en otros entornos (java, PHP, python...) crear bibliotecas de una clase e ir tomando las necesarias (instanciando y agregando).


Saludos: Miguel, La Pampa (RA)

Antonio Meza

unread,
Jun 25, 2013, 12:30:48 PM6/25/13
to publice...@googlegroups.com
Aun no termino el documento pero les comento lo que hago físicamente en el proyecto!!

Tengo mi archivo ampvcx.vcx que contiene todos mis objetos como formularios, textbox, label, grid, imagen, etc. por ejemplo el formulario a partir de la clase lo llamo frmPrincipal el cual contiene mucho código que ya no necesito estar escribiendo al crear un formulario nuevo a partir de esta clase, hasta ahí todo va bien, compilo como ampvcx.exe y listo funciona.

El problema viene que hago otro proyecto nuevo, agrego mi archivo ampvcx.vcx, pero lo marco para que no lo incluya al compilar, y en mi prg inicial abro la clase contenida en mi ejecutable ampvcx.exe, luego creo un formulario a partir de la clase frmPrincipal, le agrego controles de la misma clase, ejecuto en tiempo de desarrollo y perfecto, ejecuto el exe desde la carpeta de desarrollo y perfecto, pero si lo pongo en otra maquina me dice que no se puede instanciar la clase ampvcx.vcx.

Tengo por ejemplo métodos dentro de la clase ampvcz.vcz y si trabajan sin problema, lo que quiere decir que si esta abriendo la librería desde el exe, lo que puedo entender es que en alguna parte del proceso compilado pierde o busca físicamente el archivo .vcx y parece ser mas un bug de vfp que un error de herencia o de subclase.

Espero y me haya explicado.

NOTA: Les anexo algo de lo que uso para ver si les sirve a alguien y en cuanto termine de detallar el error para que lo puedan reproducir o igual y estoy pasando alguna instrucción por alto, algún set, etc.

Les recomiendo abran el proyecto directo desde la carpeta donde lo copiaron para que no tengan problemas con el path.

saludos
Antonio Meza
ProyectoVcx.7z
proyectovcx.pdf
Reply all
Reply to author
Forward
0 new messages