In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Mensajes entre programas
Mensajes entre programas
Hola a todos, estoy haciendo un programa aparte para realizar la
impresion de facturas en controladores fiscales siguiendo un consejo que
vi en el foro que recomienda hacer programas separados en ves de usar
programacion multihilos y queria saber si hay forma de enviar mensajes a
otro programa corriendo en la misma pc o sea mensajes entre programas ?¿
o si no que es lo mejor que me recomiendan
impresion de facturas en controladores fiscales siguiendo un consejo que
vi en el foro que recomienda hacer programas separados en ves de usar
programacion multihilos y queria saber si hay forma de enviar mensajes a
otro programa corriendo en la misma pc o sea mensajes entre programas ?¿
o si no que es lo mejor que me recomiendan
Mensajes entre programas
Christian,
¿qué tipo de datos necesitas pasar entre las dos aplicaciones?
Saludos,
José Lalín
¿qué tipo de datos necesitas pasar entre las dos aplicaciones?
Saludos,
José Lalín
Mensajes entre programas
Por ej: estan son las lineas que lee el programa que imprime en el
impresor fiscal:
FCV||C5||1428912011/09/05FCVBP00500142891 CONSUMIDOR FINAL
S/DCHUBUTCF 1 - DNI 138EFTCHUBUT
2
||IDFECHATIPOCOMPLETRANROCOMPCLIRAZONSOCCLITITULARCLI DOMICILIOCLILOCALIDADCLITIPORESPCLIDOCUMENTOCLITIPODOCT OTALCONDICIONPROVDESCRIPCIONPREFIJOOBS2
FCV||C0||EFECTIVO||
FCV||I||12122.569890.572602.749101 GAS OIL
0||ItemTasaIvaCantidadImpuestosGravadoCodProdDescProd Descuento
FCV||I||22111.907600.124803.367102 NAFTA SUPER
0||ItemTasaIvaCantidadImpuestosGravadoCodProdDescProd Descuento
Gracias
El 20/09/2011 05:59 a.m., José Lalín escribió:
> Christian,
>
> ¿qué tipo de datos necesitas pasar entre las dos aplicaciones?
>
> Saludos,
> José Lalín
>
impresor fiscal:
FCV||C5||1428912011/09/05FCVBP00500142891 CONSUMIDOR FINAL
S/DCHUBUTCF 1 - DNI 138EFTCHUBUT
2
||IDFECHATIPOCOMPLETRANROCOMPCLIRAZONSOCCLITITULARCLI DOMICILIOCLILOCALIDADCLITIPORESPCLIDOCUMENTOCLITIPODOCT OTALCONDICIONPROVDESCRIPCIONPREFIJOOBS2
FCV||C0||EFECTIVO||
FCV||I||12122.569890.572602.749101 GAS OIL
0||ItemTasaIvaCantidadImpuestosGravadoCodProdDescProd Descuento
FCV||I||22111.907600.124803.367102 NAFTA SUPER
0||ItemTasaIvaCantidadImpuestosGravadoCodProdDescProd Descuento
Gracias
El 20/09/2011 05:59 a.m., José Lalín escribió:
> Christian,
>
> ¿qué tipo de datos necesitas pasar entre las dos aplicaciones?
>
> Saludos,
> José Lalín
>
Mensajes entre programas
Christian,
si es sólo para cadenas de texto es sencillo de hacer aunque algo
laborioso. Luego intento preparar algo para que veas cómo funciona.
Saludos,
José Lalín
si es sólo para cadenas de texto es sencillo de hacer aunque algo
laborioso. Luego intento preparar algo para que veas cómo funciona.
Saludos,
José Lalín
Mensajes entre programas
Christian,
allá vamos...
En la aplicación que envía la información hay que añadir esta función:
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
HB_FUNC_STATIC( APPSENDMESSAGE ) // AppSendMessage( cWindowTitle, cString )
{
HWND hwnd = FindWindow( NULL, hb_parc( 1 ) );
if( hwnd )
{
LPTSTR lpStr = hb_parc( 2 );
COPYDATASTRUCT cds;
cds.cbData = hb_parclen( 2 ) + 1;
//Este 9999 puede cambiarse por cualquier otro valor
cds.dwData = 9999;
cds.lpData = lpStr;
SendMessage( hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds );
}
}
#pragma ENDDUMP
Los parámetros son:
* cWindowTitle: el título del formulario que recibe los datos
* cString: la cadena que quieres enviar
En la otra aplicación, en la que se tienen que recibir los datos le añades
a la declaración de la clase:
METHOD WMCopyData( nWParam, nLParam )
Y luego el código del método:
METHOD WMCopyData( nWParam, nLParam ) CLASS TForm...
LOCAL cString
cString := WM_MyCopyData( nWParam, nLParam )
MsgInfo( cString, "Recibido" )
RETURN 0
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
HB_FUNC_STATIC( WMMYCOPYDATA )
{
LPARAM lParam = (LPARAM) hb_parnl( 2 );
COPYDATASTRUCT * pcds = (COPYDATASTRUCT *) lParam;
//Comprobamos que el mensaje es para nostros
if( pcds->dwData == 9999 )
{
LPTSTR lpStr = (LPTSTR) (pcds->lpData);
hb_retc( lpStr );
}
else
hb_retc( "" );
}
#pragma ENDDUMP
Para utilizarlo, sólo tienes que ejecutar las dos aplicaciones y desde la
que envía llamar a AppSendMessage() con el título del formulario principal
de la que recibe:
AppSendMessage( "AppQueRecibe", "Datos de prueba" )
Si hay algo que no haya explicado bien no dudes en preguntar.
Saludos,
José Lalín
allá vamos...
En la aplicación que envía la información hay que añadir esta función:
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
HB_FUNC_STATIC( APPSENDMESSAGE ) // AppSendMessage( cWindowTitle, cString )
{
HWND hwnd = FindWindow( NULL, hb_parc( 1 ) );
if( hwnd )
{
LPTSTR lpStr = hb_parc( 2 );
COPYDATASTRUCT cds;
cds.cbData = hb_parclen( 2 ) + 1;
//Este 9999 puede cambiarse por cualquier otro valor
cds.dwData = 9999;
cds.lpData = lpStr;
SendMessage( hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds );
}
}
#pragma ENDDUMP
Los parámetros son:
* cWindowTitle: el título del formulario que recibe los datos
* cString: la cadena que quieres enviar
En la otra aplicación, en la que se tienen que recibir los datos le añades
a la declaración de la clase:
METHOD WMCopyData( nWParam, nLParam )
Y luego el código del método:
METHOD WMCopyData( nWParam, nLParam ) CLASS TForm...
LOCAL cString
cString := WM_MyCopyData( nWParam, nLParam )
MsgInfo( cString, "Recibido" )
RETURN 0
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
HB_FUNC_STATIC( WMMYCOPYDATA )
{
LPARAM lParam = (LPARAM) hb_parnl( 2 );
COPYDATASTRUCT * pcds = (COPYDATASTRUCT *) lParam;
//Comprobamos que el mensaje es para nostros
if( pcds->dwData == 9999 )
{
LPTSTR lpStr = (LPTSTR) (pcds->lpData);
hb_retc( lpStr );
}
else
hb_retc( "" );
}
#pragma ENDDUMP
Para utilizarlo, sólo tienes que ejecutar las dos aplicaciones y desde la
que envía llamar a AppSendMessage() con el título del formulario principal
de la que recibe:
AppSendMessage( "AppQueRecibe", "Datos de prueba" )
Si hay algo que no haya explicado bien no dudes en preguntar.
Saludos,
José Lalín
Mensajes entre programas
Christian,
> HB_FUNC_STATIC( WMMYCOPYDATA )
Cambia esto por HB_FUNC_STATIC( WM_MYCOPYDATA )
Saludos,
José Lalín
> HB_FUNC_STATIC( WMMYCOPYDATA )
Cambia esto por HB_FUNC_STATIC( WM_MYCOPYDATA )
Saludos,
José Lalín
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Mensajes entre programas
Que tal José, pregunto? y para enviarse mensajes entre ejecutables que
corren en distintas PC´s de una red tendrás algo? estuve tratando con socket
pero no pude echarlo a andar.
Muchas gracias.
corren en distintas PC´s de una red tendrás algo? estuve tratando con socket
pero no pude echarlo a andar.
Muchas gracias.
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
Mensajes entre programas
Carlos,
hay varias maneras de hacerlo:
http://msdn.microsoft.com/en-us/library ... sktop/aa36 5574%28v=vs.85%29.aspx#base.using_data_copy_for_ipc
Tengo esta anotada en mi lista de tareas para implementar dos componentes
nativos de Xailer (TMailSlotServer y TMailSlotClient):
http://msdn.microsoft.com/en-us/library ... sktop/aa36 5794%28v=vs.85%29.aspx
Si quieres hacer algo por tu cuenta, con gusto te ayudo en lo que necesites.
Saludos,
José Lalín
hay varias maneras de hacerlo:
http://msdn.microsoft.com/en-us/library ... sktop/aa36 5574%28v=vs.85%29.aspx#base.using_data_copy_for_ipc
Tengo esta anotada en mi lista de tareas para implementar dos componentes
nativos de Xailer (TMailSlotServer y TMailSlotClient):
http://msdn.microsoft.com/en-us/library ... sktop/aa36 5794%28v=vs.85%29.aspx
Si quieres hacer algo por tu cuenta, con gusto te ayudo en lo que necesites.
Saludos,
José Lalín
Mensajes entre programas
Muchas gracias Jose, voy a probarlo el fin de semana, te cuento cual es
la idea, es que la pc que tiene conectado el controlador fiscal sea muy
rapida o sea grabas el comprobante, le mando el mensaje al 'servidor
fiscal' y ya esta imprimiendo, para el resto de las pc que van a usar
ese controlador fiscal grabo un archivo de texto y lo levanto con el
'servidor fiscal' estas pueden demorar un poco porque deberian tener
menos prioridad. Asi que lo pruebo y te comento muchas gracias.
El 22/09/2011 06:41 a.m., José Lalín escribió:
> Carlos,
>
> hay varias maneras de hacerlo:
>
> http://msdn.microsoft.com/en-us/library ... sktop/aa36 5574%28v=vs.85%29.aspx#base.using_data_copy_for_ipc
>
>
> Tengo esta anotada en mi lista de tareas para implementar dos
> componentes nativos de Xailer (TMailSlotServer y TMailSlotClient):
>
> http://msdn.microsoft.com/en-us/library ... sktop/aa36 5794%28v=vs.85%29.aspx
>
>
> Si quieres hacer algo por tu cuenta, con gusto te ayudo en lo que
> necesites.
>
> Saludos,
> José Lalín
>
la idea, es que la pc que tiene conectado el controlador fiscal sea muy
rapida o sea grabas el comprobante, le mando el mensaje al 'servidor
fiscal' y ya esta imprimiendo, para el resto de las pc que van a usar
ese controlador fiscal grabo un archivo de texto y lo levanto con el
'servidor fiscal' estas pueden demorar un poco porque deberian tener
menos prioridad. Asi que lo pruebo y te comento muchas gracias.
El 22/09/2011 06:41 a.m., José Lalín escribió:
> Carlos,
>
> hay varias maneras de hacerlo:
>
> http://msdn.microsoft.com/en-us/library ... sktop/aa36 5574%28v=vs.85%29.aspx#base.using_data_copy_for_ipc
>
>
> Tengo esta anotada en mi lista de tareas para implementar dos
> componentes nativos de Xailer (TMailSlotServer y TMailSlotClient):
>
> http://msdn.microsoft.com/en-us/library ... sktop/aa36 5794%28v=vs.85%29.aspx
>
>
> Si quieres hacer algo por tu cuenta, con gusto te ayudo en lo que
> necesites.
>
> Saludos,
> José Lalín
>
Mensajes entre programas
Christian,
recuerda que este tipo de mensajes sólo funcionan entre ejecutables que
están en el mismo ordernador. Si necesitas hacerlo entre PCs de una red hay
que hacerlo con IPC como le comentaba a Carlos.
Saludos,
José Lalín
recuerda que este tipo de mensajes sólo funcionan entre ejecutables que
están en el mismo ordernador. Si necesitas hacerlo entre PCs de una red hay
que hacerlo con IPC como le comentaba a Carlos.
Saludos,
José Lalín
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Mensajes entre programas
Gracias José, ire leyendo.
"José Lalín" <dezac@corevia.com> escribió en el mensaje
news:4e7b028c$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Carlos,
hay varias maneras de hacerlo:
http://msdn.microsoft.com/en-us/library ... sktop/aa36 5574%28v=vs.85%29.aspx#base.using_data_copy_for_ipc
Tengo esta anotada en mi lista de tareas para implementar dos componentes
nativos de Xailer (TMailSlotServer y TMailSlotClient):
http://msdn.microsoft.com/en-us/library ... sktop/aa36 5794%28v=vs.85%29.aspx
Si quieres hacer algo por tu cuenta, con gusto te ayudo en lo que necesites.
Saludos,
José Lalín
"José Lalín" <dezac@corevia.com> escribió en el mensaje
news:4e7b028c$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Carlos,
hay varias maneras de hacerlo:
http://msdn.microsoft.com/en-us/library ... sktop/aa36 5574%28v=vs.85%29.aspx#base.using_data_copy_for_ipc
Tengo esta anotada en mi lista de tareas para implementar dos componentes
nativos de Xailer (TMailSlotServer y TMailSlotClient):
http://msdn.microsoft.com/en-us/library ... sktop/aa36 5794%28v=vs.85%29.aspx
Si quieres hacer algo por tu cuenta, con gusto te ayudo en lo que necesites.
Saludos,
José Lalín
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
Mensajes entre programas
Carlos,
ya tengo lo más básico funcionando.
Saludos,
José Lalín
ya tengo lo más básico funcionando.
Saludos,
José Lalín
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Mensajes entre programas
Bárbaro!!! ya me puse ansioso por ver algo!
Nuevamente muchas gracias.
Carlos Ortiz
Nuevamente muchas gracias.
Carlos Ortiz
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
Mensajes entre programas
Hola Jose, probe y la funcion que recibe los mensajes me da un error
#1: GPF (Code = c0000005):
Access violation
WM_MYCOPYDATA (0)
TFORM1:TIMER1TIMER (243)
TTIMER:ONTIMER (0)
(b)XTIMER:XTIMER (42)
TTIMER:WMTIMER (0)
RUNFORM (0)
TAPPLICATION:RUN (246)
MAIN (16)
y llamo la funcion asi:
METHOD Timer1Timer( oSender ) CLASS TForm1
local cSql, aSql, aSql2, nIni:=0, nFin:=0, i:=1, cOld, nIniId:=0, nFinId:=0
local nId, lError, nGravado, nIva, nImpuest, nTotal, nRet, cResult
local nNroInterno, aLinea, aDir, cText, aText, cTipo, cLetra, cNroComp,
aReg, aCampos
local nWParam:=0, nLParam:=0, cString
if !( ::nEstado==0 )
RETURN Nil
endif
::oTimer1:lEnabled :=.F.
::oLabel1:cText:='Inicio '+Time()
::oLabel1:Refresh()
ProcessMessages()
cString:=WM_MYCOPYDATA( nWParam, nLParam )
....
RETURN Nil
//---------------------------------------------------------- --------------------
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
HB_FUNC_STATIC( WM_MYCOPYDATA )
{
LPARAM lParam = (LPARAM) hb_parnl( 2 );
COPYDATASTRUCT * pcds = (COPYDATASTRUCT *) lParam;
//Comprobamos que el mensaje es para nostros
if( pcds->dwData == 9999 )
{
LPTSTR lpStr = (LPTSTR) (pcds->lpData);
hb_retc( lpStr );
}
else
hb_retc( "" );
}
#pragma ENDDUMP
El 22/09/2011 08:02 a.m., José Lalín escribió:
> Christian,
>
> recuerda que este tipo de mensajes sólo funcionan entre ejecutables que
> están en el mismo ordernador. Si necesitas hacerlo entre PCs de una red
> hay que hacerlo con IPC como le comentaba a Carlos.
>
> Saludos,
> José Lalín
>
#1: GPF (Code = c0000005):
Access violation
WM_MYCOPYDATA (0)
TFORM1:TIMER1TIMER (243)
TTIMER:ONTIMER (0)
(b)XTIMER:XTIMER (42)
TTIMER:WMTIMER (0)
RUNFORM (0)
TAPPLICATION:RUN (246)
MAIN (16)
y llamo la funcion asi:
METHOD Timer1Timer( oSender ) CLASS TForm1
local cSql, aSql, aSql2, nIni:=0, nFin:=0, i:=1, cOld, nIniId:=0, nFinId:=0
local nId, lError, nGravado, nIva, nImpuest, nTotal, nRet, cResult
local nNroInterno, aLinea, aDir, cText, aText, cTipo, cLetra, cNroComp,
aReg, aCampos
local nWParam:=0, nLParam:=0, cString
if !( ::nEstado==0 )
RETURN Nil
endif
::oTimer1:lEnabled :=.F.
::oLabel1:cText:='Inicio '+Time()
::oLabel1:Refresh()
ProcessMessages()
cString:=WM_MYCOPYDATA( nWParam, nLParam )
....
RETURN Nil
//---------------------------------------------------------- --------------------
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
HB_FUNC_STATIC( WM_MYCOPYDATA )
{
LPARAM lParam = (LPARAM) hb_parnl( 2 );
COPYDATASTRUCT * pcds = (COPYDATASTRUCT *) lParam;
//Comprobamos que el mensaje es para nostros
if( pcds->dwData == 9999 )
{
LPTSTR lpStr = (LPTSTR) (pcds->lpData);
hb_retc( lpStr );
}
else
hb_retc( "" );
}
#pragma ENDDUMP
El 22/09/2011 08:02 a.m., José Lalín escribió:
> Christian,
>
> recuerda que este tipo de mensajes sólo funcionan entre ejecutables que
> están en el mismo ordernador. Si necesitas hacerlo entre PCs de una red
> hay que hacerlo con IPC como le comentaba a Carlos.
>
> Saludos,
> José Lalín
>
Mensajes entre programas
Christian,
¿para qué has puesto el timer? No es necesario, el propio sistema se
encarga de recibir WMCopyData() en el formulario. Tienes que hacerlo como
te dije en el otro mensaje: en una aplicación AppSendMessage() para enviar
y en la otra WMCopyData en el formulairo y WM_MyCopyData.
Saludos,
José Lalín
¿para qué has puesto el timer? No es necesario, el propio sistema se
encarga de recibir WMCopyData() en el formulario. Tienes que hacerlo como
te dije en el otro mensaje: en una aplicación AppSendMessage() para enviar
y en la otra WMCopyData en el formulairo y WM_MyCopyData.
Saludos,
José Lalín
Mensajes entre programas
Lo probe y corregi lo que puse mal, quedo fantastico muy rapido e
instantaneo.
muchas gracias
PD: Carlos Ortiz si no te molesta, me interesaria ver como quedaria con
sockets el servidor fiscal, me podes enviar la informacion para
programarlo (o las funciones en C). Igual te comento mi idea desde la pc
que factura y tiene el servidor fiscal que sea muy rapida la impresion,
es mas grabo la cabecera de la venta y ya lo mando a imprimir, en cambio
desde las otras pc como le quiero dar menos prioridad grabo un archivo
en una carpeta compartida del servidor fiscal y me dio buenos resultados.
El 26/09/2011 05:31 a.m., José Lalín escribió:
> Christian,
>
> ¿para qué has puesto el timer? No es necesario, el propio sistema se
> encarga de recibir WMCopyData() en el formulario. Tienes que hacerlo
> como te dije en el otro mensaje: en una aplicación AppSendMessage() para
> enviar y en la otra WMCopyData en el formulairo y WM_MyCopyData.
>
> Saludos,
> José Lalín
>
instantaneo.
muchas gracias
PD: Carlos Ortiz si no te molesta, me interesaria ver como quedaria con
sockets el servidor fiscal, me podes enviar la informacion para
programarlo (o las funciones en C). Igual te comento mi idea desde la pc
que factura y tiene el servidor fiscal que sea muy rapida la impresion,
es mas grabo la cabecera de la venta y ya lo mando a imprimir, en cambio
desde las otras pc como le quiero dar menos prioridad grabo un archivo
en una carpeta compartida del servidor fiscal y me dio buenos resultados.
El 26/09/2011 05:31 a.m., José Lalín escribió:
> Christian,
>
> ¿para qué has puesto el timer? No es necesario, el propio sistema se
> encarga de recibir WMCopyData() en el formulario. Tienes que hacerlo
> como te dije en el otro mensaje: en una aplicación AppSendMessage() para
> enviar y en la otra WMCopyData en el formulairo y WM_MyCopyData.
>
> Saludos,
> José Lalín
>
Mensajes entre programas
Christian,
> Lo probe y corregi lo que puse mal, quedo fantastico muy rapido e instantaneo.
me alegra saber que lo has resuelto
Saludos,
José Lalín
> Lo probe y corregi lo que puse mal, quedo fantastico muy rapido e instantaneo.
me alegra saber que lo has resuelto

Saludos,
José Lalín
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Mensajes entre programas
Yo tengo algo parecido usando archivos para enviar la impresión al printer
fiscal, pero quiero hacer algo mas copado enviando mensajes entre
ejecutables, por ejemplo un mini servidor fiscal para que emita comprobantes
ó enviar avisos en pantalla para poder actualizar la aplicación (o
enviandoles un QUIT para que salgan a la fuerza)
Cualquier avance te pongo con copia.
Un saludo
fiscal, pero quiero hacer algo mas copado enviando mensajes entre
ejecutables, por ejemplo un mini servidor fiscal para que emita comprobantes
ó enviar avisos en pantalla para poder actualizar la aplicación (o
enviandoles un QUIT para que salgan a la fuerza)
Cualquier avance te pongo con copia.
Un saludo
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar