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.

Mensajes entre programas

Foro público de Xailer en español
Responder
Christian
Mensajes: 290
Registrado: Mié Abr 23, 2008 10:18 pm

Mensajes entre programas

Mensaje por Christian »

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
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

Christian,
¿qué tipo de datos necesitas pasar entre las dos aplicaciones?
Saludos,
José Lalí­n
Christian
Mensajes: 290
Registrado: Mié Abr 23, 2008 10:18 pm

Mensajes entre programas

Mensaje por Christian »

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
>
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

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
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

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
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

Christian,
> HB_FUNC_STATIC( WMMYCOPYDATA )
Cambia esto por HB_FUNC_STATIC( WM_MYCOPYDATA )
Saludos,
José Lalí­n
Avatar de Usuario
Carlos Ortiz
Mensajes: 873
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Mensajes entre programas

Mensaje por Carlos Ortiz »

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.
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

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
Christian
Mensajes: 290
Registrado: Mié Abr 23, 2008 10:18 pm

Mensajes entre programas

Mensaje por Christian »

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
>
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

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
Avatar de Usuario
Carlos Ortiz
Mensajes: 873
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Mensajes entre programas

Mensaje por Carlos Ortiz »

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
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

Carlos,
ya tengo lo más básico funcionando.
Saludos,
José Lalí­n
Avatar de Usuario
Carlos Ortiz
Mensajes: 873
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Mensajes entre programas

Mensaje por Carlos Ortiz »

Bárbaro!!! ya me puse ansioso por ver algo!
Nuevamente muchas gracias.
Carlos Ortiz
Christian
Mensajes: 290
Registrado: Mié Abr 23, 2008 10:18 pm

Mensajes entre programas

Mensaje por Christian »

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
>
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

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
Christian
Mensajes: 290
Registrado: Mié Abr 23, 2008 10:18 pm

Mensajes entre programas

Mensaje por Christian »

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
>
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Mensajes entre programas

Mensaje por jlalin »

Christian,
> Lo probe y corregi lo que puse mal, quedo fantastico muy rapido e instantaneo.
me alegra saber que lo has resuelto :-D
Saludos,
José Lalí­n
Avatar de Usuario
Carlos Ortiz
Mensajes: 873
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Mensajes entre programas

Mensaje por Carlos Ortiz »

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
Responder