Consulta sobre impresión y puertos LPTx

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

Consulta sobre impresión y puertos LPTx

Post by triumvirato »

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!
fernandomoralesdr
Posts: 134
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Post by fernandomoralesdr »

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
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Post by triumvirato »

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.
fernandomoralesdr
Posts: 134
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Post by fernandomoralesdr »

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: 134
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Post by fernandomoralesdr »

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
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Post by triumvirato »

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: http://forums.fivetechsupport.com/viewt ... rn+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!
fernandomoralesdr
Posts: 134
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Post by fernandomoralesdr »

¿Cómo estás creando el objeto objeto oPrn?
Un saludo,
Fernando
Las Palmas de Gran Canaria
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Post by triumvirato »

Fernando,

Code: Select all

   oPrn := TDosPrn():New("lpt1")
 
fernandomoralesdr
Posts: 134
Joined: Sun Apr 23, 2006 9:00 am

Re: Consulta sobre impresión y puertos LPTx

Post by fernandomoralesdr »

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
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Post by triumvirato »

Fernando,

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


Saludos!
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Consulta sobre impresión y puertos LPTx

Post by Antonio Linares »

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

// 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
triumvirato
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Re: Consulta sobre impresión y puertos LPTx

Post by triumvirato »

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!
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

Re: Consulta sobre impresión y puertos LPTx

Post by Willi Quintana »

Excelente.... y pa xHarbour???
Salu2
Post Reply