Eventos de dlls creadas en VFP

271 views
Skip to first unread message

francisco prieto

unread,
Feb 1, 2016, 4:21:42 PM2/1/16
to publicesvfoxpro
Chicos,

Tengo una dll que cree a partir de una vcx y funciona sin inconvenientes.

Tambien he probado de crearla desde un prg.

Ahora bien si quiero utilizar los eventos de la dll el VFP, no respode... estos eventos disparo utilizando assign de VFP. En modo VCX funciona perfecto, pero en modo dll no.

Buscando encontré esto

https://msdn.microsoft.com/en-US/library/9e3x7620%28v=vs.80%29.aspx?f=255&MSPPError=-2147217396

Pero aca lo que hace es permitir instanciar una interfase de la dll.

Entonces mi pregunta es... desde VFP se puede crear una interfase que luego pueda ser llamada con implements.

Hasta ahora la única solución que encontré es colocar un timer externo que revise si cambiaron las propiedades, pero quería consultar si conocen una solución mas elegante.

Saludos,

Pancho
Córdoba
Argentina

francisco prieto

unread,
Feb 1, 2016, 4:32:34 PM2/1/16
to publicesvfoxpro
Lo mas cercano que encontre hasta ahora es esto de Victor Espina

http://www.victorespina.com.ve/wiki/index.php?title=Implementacion_de_interfaces_en_VFP

Sigo investigando a ver si logro interceptar los eventos.

Saludos,

Pancho
Còrdoba
Argentina

francisco prieto

unread,
Feb 5, 2016, 5:56:30 AM2/5/16
to publicesvfoxpro
Ahí se explica una funcionalidad de la clase VFPCom.dll (ExportEvents), cuya clase se puede bajar de

https://www.microsoft.com/en-us/download/details.aspx?id=2049

(Este link deberias actualizarlo Luis Maria)

Ese mismo artículo me llama la atención que dice...

El método ExportEvents es para ser usado en “tiempo de desarrollo”. Permite exportar la interfaz del objeto COM (es decir, qué eventos genera) a una clase VFP. La clase VFP se genera en un archivo de texto (es decir, la definición está hecha en forma programática - no visual -, con DEFINE CLASS .... ENDDEFINE).

Ya instale el VFPCom.dll

Ahora tratare de implementarlo con mi dll para ver si puedo finalmente manejar los eventos en forma externa, pero dejo mi pregunta para Luis Maria

Porque decis que el método es para ser usado en "tiempo de desarrollo"?

Saludos,

Pancho
Córdoba
Argentina


Antonio Meza

unread,
Feb 5, 2016, 11:29:21 AM2/5/16
to Comunidad de Visual Foxpro en Español
Maestro Francisco!!!

Creo que el articulo hace referencia que en tiempo de desarrollo creas la clase (archivo prg) que luego editas para que puedas manipular los eventos a gusto, ya que al generarlo en tiempo de ejecución pues tendrías que modificar el archivo de clases por código, algo que es mas sencillo en diseño , lo adaptas y ya no tienes que volver a crearlo.

Esta interesante lo que se puede hacer con VFPCOM.

saludos
Antonio Meza

Antonio Meza

unread,
Feb 5, 2016, 11:30:56 AM2/5/16
to Comunidad de Visual Foxpro en Español
Por cierto el articulo no es del Maestro LuisMa,

Artículo escrito por Antonio Castaño, Microsoft Visual FoxPro - MVP y publicado en la revista del MUG (MS Users Group de Argentina) en el mes de Junio de 2000.

saludos
Antonio Meza

francisco prieto

unread,
Feb 5, 2016, 12:13:05 PM2/5/16
to publicesvfoxpro
Tiene algo parecido, solo que en vez de necesitar ExportEvents, si tenes VFP9 lo podes hacer perfectamente con EventHandler...

Ahora me voy a almorzar, pero a la vuelta seguro que lo tengo solucionado y como siempre si es asi subo el codigo para que quede documentado.

Saludos,

Pancho
Córdoba
Argentina

Marco Plaza

unread,
Feb 5, 2016, 12:20:22 PM2/5/16
to Comunidad de Visual Foxpro en Español

Hola Francisco,  la función eventhandler() no funciona con servidores COM creados por VFP,
sólo se engancha a servidores ActiveX como internet explorer , Office o Ado.

En su lugar debes usar una técnica de callback como se explica en la sección de ayuda
"Visual FoxPro and Advanced COM", y modificar tu dll y añadirle 1) una clase que defina los
eventos que deseas implementar externamente 2)  un método que reciba el objeto que implementa
los eventos 3) llamadas a los métodos de ese objeto cuando estimes necesario.

También puedes usar el sistema de publicador/suscriptor de eventos de windows como se
explica en \Samples\Com+\Events.

Saludos.

Nota:
La utilidad vfpcom.dll ya no es necesaria, puedes usar el explorador de objetos, abrir la dll
 y arrastrar la interface que desees implementar al editor, y se creará el código para implementar
la interface.

francisco prieto

unread,
Feb 5, 2016, 12:32:02 PM2/5/16
to publicesvfoxpro
La tecnica de Call Back que decis que se menciona.

Podras enviarme un link de ejemplo

Gracias,

Pancho
Córdoba
Argentina

Marco Plaza

unread,
Feb 5, 2016, 1:46:39 PM2/5/16
to Comunidad de Visual Foxpro en Español


Alli se encuentra el codigo fuente del programa de ejemplo IDEMO.prg,
pero recordé que es bastante confusa su presentación al encapsular en
el mismo prg el publicador y el suscriptor, y no explica el porqué de los
nombres empleados, que son muy parecidos, asi que tomé el codigo y lo
separé para mejor comprensión en dos programas ( anexos ) con una
nueva nomenclatura para los métodos que hará mas clara su distinción.

debes ejecutar idemo.prg en modo administrador para crear la dll, luego
la pruebas con idemo interfaceimplementation.prg

Saludos
idemoInterfaceImplementation.PRG
idemo.PRG

francisco prieto

unread,
Feb 5, 2016, 2:09:40 PM2/5/16
to publicesvfoxpro
Gracias Marco, Muy interesante!!!

Ahora lo voy a estudiar y adaptar a mi dll

Lo que si entiendo es que para poder manejar los eventos  de mi dll debo armar mi propio idemoInterfaceImplementation, pero esto va a funcionar desde dentro de VFP.

Es decir supongamos que quisiera que funcione el evento desde Access, pues quiero usar mi dll en Access, ahi sigue sin andar , no es cierto?

Saludos,

Pancho
Córdoba
Argentina

Marco Plaza

unread,
Feb 5, 2016, 3:37:43 PM2/5/16
to Comunidad de Visual Foxpro en Español

No creo que se pueda.. imagino que habría que usar com Interop para
importar el objeto a un un servidor .net  y que este sea quien publique
los eventos.

francisco prieto

unread,
Feb 5, 2016, 3:48:05 PM2/5/16
to publicesvfoxpro
Para eso hago la dll directamente en .Net.

Gracias,

Saludos,

Pancho
Córdoba
Argentina
Reply all
Reply to author
Forward
0 new messages