Consulta sobre impresión y puertos LPTx

Consulta sobre impresión y puertos LPTx

Postby triumvirato » Tue Aug 24, 2010 9:27 am

Estoy tratando de comenzar a migrar los primeros informes de una aplicación hecha en clipper, que trabaja fundamentalmente con impresoras matriciales. Por lo que me he podido documentar en estos foros, la clase que mejor se adapta sería la TdosPrn, pero me encuentro con el inconveniente de cómo han sido elaborados esos listados en clipper. El 99% de ellos estan escritos con el comando "?" y "??" para el envío de datos a la impresora, por lo que me interesaría saber si existe alguna clase que soporte el envío a impresora mediante esos comandos.

Por otro lado, me gustaría saber si alguien ha conseguido resolver el problema de saber si una impresora conectada a un puerto LPTx está online. La función PrintReady() siempre devuelve .f. en todo caso, IsPrinter() siempre devuelve .t. y no encuentro manera ni función que hagan esto de forma fiable. Por lo que he leído, el problema está en que los sistemas basados en NT (XP en adelante), no permiten el acceso diréctamente a los puertos si no es a través de un driver de hardware o que la aplicación sea capaz de correr en modo "Kernel", en cuyo caso no tiene ninguna restricción para acceder a los puertos. Esto funciona así, por lo visto, por motivos de seguridad. http://logix4u.net/Legacy_Ports/Paralle ... NT/XP.html de ahí he sacado la información y ahí hay una DLL (32/64 bits) que permite el acceso directo a los puertos, con código fuente, ejemplos, etc. libre de uso para aplicaciones no comerciales. El problema está en que mis conocimientos para hacer uso de esa DLL o entender el código C, es prácticamente nulo. Resumiendo, mi pregunta es si hay alguna manera de resolver este incoveniente.
Pido disculpas si digo/pregunto alguna burrada pues soy bastante novato en todo esto.

Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Postby fernandomoralesdr » Wed Aug 25, 2010 1:08 pm

Hola.
Me tropecé con un problema muy similar al tuyo cuando migré de Clipper a Fivewin y tenia listados definidos para matriciales con papel de 6 pulgadas de alto, y no te queda otro remedio que TDosPrn(), aunque mis listados no estaban definidos en Clipper con ? y ??, sino con row(), col(). Si quieres te paso un ejemplo.
En cuanto a lo de saber si la impresora está lista mi solución es la siguiente: siempre que mandas a imprimir lanzas un mensaje tipo "Compruebe que la impresora está encendida".
Un saludo,
Fernando
Las Palmas de Gran Canaria
fernandomoralesdr
 
Posts: 139
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Postby triumvirato » Wed Aug 25, 2010 2:15 pm

Fernando,

Gracias por tu ayuda. Respecto de los comandos "?" y "??", creo que no me queda más opción que ir listado a listado modificándolo por oPrn:Write y oPrn:NewLine según sea el caso. Así que se soluciona con paciencia :) , eso que nos falta a muchos.

Respecto del problema para saber si la impresora está lista o no, el inconveniente que veo es que con el paso del tiempo el usuario tiende a "pasar olímpicamente" del mensaje. Y claro, llega el día que la impresora no estaba encendida y el informe se perdió y tengo varios informes que una vez impresos, reimprimirlos es prácticamente imposible.

Estoy pegándome con la DLL que comentaba en el primer post, pero mis conociminetos de C son nulos. Lo bueno de esa dll es que lleva enbebido un Driver en modo kernel, que haciendo uso de él, tendríamos acceso al puerto LPT en concreto y ahí sí sería posible preguntar si la impresora está lista. También teniendo el código fuente en C de la DLL creo que habría la posibilidad de escribir alguna rutina para poder usar con Harbour y FWH, pero eso ya tendría que ser algún gurú del C

Gracias y saludos.
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Postby fernandomoralesdr » Wed Aug 25, 2010 3:15 pm

Déjame que mire algunos ejemplos con TPrinter, no sé por qué me suena de haber visto por algún lado una línea preguntando por el estado de la impresora. Te digo algo.
Un saludo,
Fernando
Las Palmas de Gran Canaria
fernandomoralesdr
 
Posts: 139
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Postby fernandomoralesdr » Wed Aug 25, 2010 3:19 pm

Lo dicho, me sonaba de haber visto algo. Lo puedes encontrar en el directorio FWH\SAMPLES\TESTRTF.PRG.

if Empty( oPrn:hDC )
MsgStop( "Printer not ready!" )
return nil
endif
Un saludo,
Fernando
Las Palmas de Gran Canaria
fernandomoralesdr
 
Posts: 139
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Postby triumvirato » Wed Aug 25, 2010 4:18 pm

Fernando,

Muchas gracias por tus apuntes, de hecho había visto ese método en otro post de este foro. En principio estoy usando la clase TDosPrn y desconozco si tu ejemplo sirve para esa clase, en todo caso he hecho pruebas y no funciona, nunca marca que la impresora está "Off Line", tanto conectada directamente como en impresora compartida.
He leido muchos hilos en este foro y no encuentro solución, a pesar de que se han hecho varios intentos como en este por ejemplo: viewtopic.php?f=3&t=3526&hilit=tdosprn+clipper
Sin embargo encontré esa DLL y me he hecho demasiadas ilusiones creo yo, no obstante seguiré intentando por si obtengo algún resultado.

Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Postby fernandomoralesdr » Wed Aug 25, 2010 4:44 pm

¿Cómo estás creando el objeto objeto oPrn?
Un saludo,
Fernando
Las Palmas de Gran Canaria
fernandomoralesdr
 
Posts: 139
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Postby triumvirato » Wed Aug 25, 2010 4:50 pm

Fernando,

Code: Select all  Expand view
  oPrn := TDosPrn():New("lpt1")
 
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Postby fernandomoralesdr » Wed Aug 25, 2010 5:15 pm

Ok, he estado probando con mi impresora, pero me da que lo que hacia bajo Clipper IsPrinter() no sirve bajo Windows/Harbour lo que sea.
Lo siento.
Un saludo,
Fernando
Las Palmas de Gran Canaria
fernandomoralesdr
 
Posts: 139
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Postby triumvirato » Thu Aug 26, 2010 6:10 am

Fernando,

Muchas gracias por tu ayuda. A ver si alguien puede arrojar más luz...


Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Postby Antonio Linares » Thu Aug 26, 2010 7:55 am

David,

Estoy revisando el ejemplo Test2.c que está en http://www.hytherion.com/beattidp/comput/pport.htm y parece que podemos adaptarlo facilmente a Harbour :-)

Aqui tienes Test2.prg compilando y funcionando bien :-)
Code: Select all  Expand view
// Adaptado para funcionar con Harbour y FWH

#include "FiveWin.ch"

function Main()

   TestPrn()
   
return nil

#pragma BEGINDUMP  

/**************************************************/
/***                                            ***/
/*** Test2.c  -- test interface to inpout32.dll ***/
/***  ( http://www.logix4u.net/inpout32.htm )   ***/
/***                                            ***/
/*** Copyright (C) 2005, Douglas Beattie Jr.    ***/
/***                                            ***/
/***    <beattidp@ieee.org>                     ***/
/***    http://www.hytherion.com/beattidp/      ***/
/***                                            ***/
/**************************************************/
/*  Last Update: 2006.05.14
 */


/*******************************************************/
/*                                                     */
/*  Builds with Borland's Command-line C Compiler      */
/*    (free for public download from Borland.com, at   */
/*  http://www.borland.com/bcppbuilder/freecompiler )  */
/*                                                     */
/*   Compile with:                                     */
/*                                                     */
/*   BCC32 -IC:\BORLAND\BCC55\INCLUDE  TEST2.C         */
/*                                                     */
/*                                                     */
/*  Be sure to change PPORT_BASE (Port Base address)   */
/*  accordingly if your LPT port is addressed          */
/*  elsewhere.                                         */
/*                                                     */
/*******************************************************/


#include <stdio.h>
#include <conio.h>
#include <windows.h>


/* Definitions in the build of inpout32.dll are:            */
/*   short _stdcall Inp32(short PortAddress);               */
/*   void _stdcall Out32(short PortAddress, short data);    */

/* prototype (function typedef) for DLL function Inp32: */

     typedef short (_stdcall *inpfuncPtr)(short portaddr);
     typedef void (_stdcall *oupfuncPtr)(short portaddr, short datum);

#define PPORT_BASE 0x378


// Prototypes for Test functions
void test_read8(void);
void test_write(void);
void test_write_datum(short datum);


/* After successful initialization, these 2 variables
   will contain function pointers.
 */

     inpfuncPtr inp32fp;
     oupfuncPtr oup32fp;


/* Wrapper functions for the function pointers
    - call these functions to perform I/O.
 */

     short  Inp32 (short portaddr)
     {
          return (inp32fp)(portaddr);
     }

     void  Out32 (short portaddr, short datum)
     {
          (oup32fp)(portaddr,datum);
     }


HB_FUNC( TESTPRN )
{
     HINSTANCE hLib;

     short x;
     int i;


     /* Load the library */
     hLib = LoadLibrary("inpout32.dll");

     if (hLib == NULL) {
          fprintf(stderr,"LoadLibrary Failed.\n");
          // return -1;
     }

     /* get the address of the function */

     inp32fp = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

     if (inp32fp == NULL) {
          fprintf(stderr,"GetProcAddress for Inp32 Failed.\n");
          // return -1;
     }


     oup32fp = (oupfuncPtr) GetProcAddress(hLib, "Out32");

     if (oup32fp == NULL) {
          fprintf(stderr,"GetProcAddress for Oup32 Failed.\n");
          // return -1;
     }


/*******************************************************/
/** IF WE REACHED HERE, INITIALIZED SUCCESSFUL    ******/
/*******************************************************/

     /* now test the functions */


     /***** Read 8 bytes at I/O base address */
     test_read8();


     /*****  Write 0x75 to data register and verify */
     test_write();



     /*****  One more time, different value */
     test_write_datum(0xAA);


     /* finished - unload library and exit */
     FreeLibrary(hLib);
     // return 0;
}

/*
   TEST:  Read inputs of 8 registers from PORT_BASE address
 */

void test_read8(void) {

     short x;
     int i;
     char buffer[ 100 ];

     /* Try to read 0x378..0x37F, LPT1:  */

     for (i=PPORT_BASE; (i<(PPORT_BASE+8)); i++) {

          x = Inp32(i);

          sprintf( buffer, "Port read (%04X)= %04X\n",i,x);
          MessageBox( 0, buffer, "OK", 0 );
     }

}

/*
   TEST:  Write constant 0x77 to PORT_BASE (Data register)
 */

void test_write(void) {
     short x;
     int i;
     char buffer[ 100 ];

     /*****  Write the data register */

     i=PPORT_BASE;
     x=0x75;

     /*****  Write the data register */
     Out32(i,x);

     sprintf(buffer, "Port write to 0x%X, datum=0x%2X\n" ,i ,x);
     MessageBox( 0, buffer, "OK", 0 );

     /***** And read back to verify  */
     x = Inp32(i);
     sprintf(buffer, "Port read (%04X)= %04X\n",i,x);
     MessageBox( 0, buffer, "OK", 0 );

     /*****  Set all bits high */
     x=0xFF;
     Out32(i,x);

     /*****  Now, set bi-directional and read again */
     Out32(PPORT_BASE+2,0x20);     // Activate bi-directional
     x = Inp32(i);
     sprintf(buffer, "Set Input, read (%04X)= %04X\n",i,x);
     MessageBox( 0, buffer, "OK", 0 );

     Out32(PPORT_BASE+2,0x00);     // Set Output-only again
     x = Inp32(i);
     sprintf(buffer, "Reset Ouput, read (%04X)= %04X\n",i,x);
     MessageBox( 0, buffer, "OK", 0 );


}

/*
   TEST:  Write data from parameter
 */

void test_write_datum(short datum) {
     short x;
     int i;
     char buffer[ 100 ];

     i=PPORT_BASE;
     x = datum;

     /*****  Write the data register */
     Out32(i,x);

     sprintf(buffer, "Port write to 0x%X, datum=0x%2X\n" ,i ,x);
     MessageBox( 0, buffer, "OK", 0 );

     /***** And read back to verify  */
     x = Inp32(i);
     sprintf(buffer, "Port read (%04X)= %04X\n",i,x);
     MessageBox( 0, buffer, "OK", 0 );
}

#pragma ENDDUMP
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41323
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Consulta sobre impresión y puertos LPTx

Postby triumvirato » Thu Aug 26, 2010 9:35 am

Antonio,

:) magistral.

Compilado y ejecutado, aparentemente no da error, todo ok y BIDIRECCIONAL!!! lectura/escritura, vamos, que es directo al puerto.
Las pruebas que hace test2.prg dan todas ok.

Ahora a ver si teniendo acceso directo al puerto LPT se puede hacer funcionar a IsPrinter() o PrintReady() con alguna adaptación.

Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Postby Willi Quintana » Thu Aug 26, 2010 5:38 pm

Excelente.... y pa xHarbour???
Salu2
User avatar
Willi Quintana
 
Posts: 1002
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 9 guests