FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Printers
Posts: 824
Joined: Thu Oct 13, 2005 07:39 AM
Re: Printers
Posted:

Hello Ootto,

there is a function PrintStat (nLpt) in xHarbour, which should return the status. But it seems to exist only for compatibility reasons.

Better you use Uwe´s suggestion, this is a fivewin function.

Uwe,

according to the docu this function needs the printer name as parameter, in your sample you use the port. What is correct now ?

kind regards

Stefan
Posts: 92
Joined: Thu Feb 15, 2007 11:37 AM
Printers
Posted: Fri May 29, 2009 05:09 PM

How to get the default printer on the computer?

How to get the printer port standard?

If the default is mapped, how to get the path?
Example: \computer\printer

FiveWin 9.03 + xHarbour !!
Posts: 824
Joined: Thu Oct 13, 2005 07:39 AM
Re: Printers
Posted: Tue Jun 02, 2009 07:27 AM

Anderson,

with xharbour you can use GetPrinters(lPorts) to get an array of all available printers and GetDefaultPrinter () to get the default printer.

kind regards

Stefan
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: Printers
Posted: Tue Jun 02, 2009 08:36 AM
Hello Stefan,

thank you for your information.
Do you know if you could also get the status of the printer?

Thanks in advance
Otto

Code (fw): Select all Collapse
   
For nX := 1 To Len(aPrinters) 
   ?  "Druckername:   " + aPrinters[nX][1],;
  "Drucker-Port:  " + aPrinters[nX][2],;
 "Lokal/Netz: " + aPrinters[nX][3] ,;
            "Modell: " + aPrinters[nX][4],;
"Freigabename: " + aPrinters[nX][5]   
   Next
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: Printers
Posted: Tue Jun 02, 2009 10:57 AM
Hello Otto,

I think it is possible, to add PrnStatus() inside the For Next.

Code (fw): Select all Collapse
#define PRINTER_STATUS_OK                       0
#define PRINTER_STATUS_PAUSED                   1
#define PRINTER_STATUS_ERROR                    2
#define PRINTER_STATUS_PENDING_DELETION         4
#define PRINTER_STATUS_PAPER_JAM                8
#define PRINTER_STATUS_PAPER_OUT               16
#define PRINTER_STATUS_MANUAL_FEED             32
#define PRINTER_STATUS_PAPER_PROBLEM           64
#define PRINTER_STATUS_OFFLINE                128
#define PRINTER_STATUS_IO_ACTIVE              256
#define PRINTER_STATUS_BUSY                   512
#define PRINTER_STATUS_PRINTING              1024
#define PRINTER_STATUS_OUTPUT_BIN_FULL       2048
#define PRINTER_STATUS_NOT_AVAILABLE         4096
#define PRINTER_STATUS_WAITING               8192
#define PRINTER_STATUS_PROCESSING           16384
#define PRINTER_STATUS_INITIALIZING         32768
#define PRINTER_STATUS_WARMING_UP           65536
#define PRINTER_STATUS_TONER_LOW           131072
#define PRINTER_STATUS_NO_TONER            262144
#define PRINTER_STATUS_PAGE_PUNT           524288
#define PRINTER_STATUS_USER_INTERVENTION  1048576
#define PRINTER_STATUS_OUT_OF_MEMORY      2097152
#define PRINTER_STATUS_DOOR_OPEN          4194304
#define PRINTER_STATUS_SERVER_UNKNOWN     8388608
#define PRINTER_STATUS_POWER_SAVE        16777216

For nX := 1 To Len(aPrinters) 
   ?  "Druckername:   " + aPrinters[nX][1],;
      "Drucker-Port:  " + aPrinters[nX][2],;   
      "Lokal/Netz: " + aPrinters[nX][3] ,;
      "Modell: " + aPrinters[nX][4],;
      "Freigabename: " + aPrinters[nX][5], ;  
      "Status : " + STR ( PrnStatus( aPrinters[nX][2] ) )   
Next

// Syntax : PrnStatus( "LPT1:" )
// I don't know, if aPrinters[nX][2]  Returns a string : "LPT1" or "LPT1:" ( not tested )
// Maybe to change in : aPrinters[nX][2] + ":"  

return nil


Best Regards
Uwe :-)
Since 1995 ( the first release of FW 1.9 )

i work with FW.

If you have any questions about special functions, maybe i can help.
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: Printers
Posted: Tue Jun 02, 2009 12:09 PM
Hello Stefan,

The sample prnstat.prg shows :

Function Main()
local nStatus := PrnStatus( "LPT1:" )
MsgInfo( nStatus )
return nil

I had a look at printdc.c ( subdirectory /winapi )
PRNSTATUS( PARAMS ) // cPrinter or cPrinterServer --> nStatus

I have to test on a different computer.

Best Regards
Uwe :-)
Since 1995 ( the first release of FW 1.9 )

i work with FW.

If you have any questions about special functions, maybe i can help.
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: Printers
Posted: Tue Jun 02, 2009 02:38 PM

Hello Stefan, hello Uwe,

thank you for your help.
With printername parameter 1 I get the correct results.
Best regards,
Otto

Posts: 824
Joined: Thu Oct 13, 2005 07:39 AM
Re: Printers
Posted: Wed Jun 03, 2009 08:13 AM
Hi Uwe,

the portname seems to be the correct parameter.

I enhanced the sample to get all printers with their status. But for all network printers I get the status 4096 (not available).

Could you please check, if you get other results

Code (fw): Select all Collapse
#include "Fivewin.ch"

#define PRINTER_STATUS_OK                       0
#define PRINTER_STATUS_PAUSED                   1
#define PRINTER_STATUS_ERROR                    2
#define PRINTER_STATUS_PENDING_DELETION         4
#define PRINTER_STATUS_PAPER_JAM                8
#define PRINTER_STATUS_PAPER_OUT               16
#define PRINTER_STATUS_MANUAL_FEED             32
#define PRINTER_STATUS_PAPER_PROBLEM           64
#define PRINTER_STATUS_OFFLINE                128
#define PRINTER_STATUS_IO_ACTIVE              256
#define PRINTER_STATUS_BUSY                   512
#define PRINTER_STATUS_PRINTING              1024
#define PRINTER_STATUS_OUTPUT_BIN_FULL       2048
#define PRINTER_STATUS_NOT_AVAILABLE         4096
#define PRINTER_STATUS_WAITING               8192
#define PRINTER_STATUS_PROCESSING           16384
#define PRINTER_STATUS_INITIALIZING         32768
#define PRINTER_STATUS_WARMING_UP           65536
#define PRINTER_STATUS_TONER_LOW           131072
#define PRINTER_STATUS_NO_TONER            262144
#define PRINTER_STATUS_PAGE_PUNT           524288
#define PRINTER_STATUS_USER_INTERVENTION  1048576
#define PRINTER_STATUS_OUT_OF_MEMORY      2097152
#define PRINTER_STATUS_DOOR_OPEN          4194304
#define PRINTER_STATUS_SERVER_UNKNOWN     8388608
#define PRINTER_STATUS_POWER_SAVE        16777216

function Main()

   local nStatus := PrnStatus( "LPT1:" )

   MsgInfo( nStatus)
   
   CheckAll ()

return nil


FUNCTION CheckAll ()

LOCAL nx, aPrinters, cPrn

aPrinters := GetPrinters(.t.)

For nX := 1 To Len(aPrinters)
   cPrn := "Druckername:   " + aPrinters[nX][1] +CRLF+;
           "Drucker-Port:  " + aPrinters[nX][2] +CRLF+;  
           "Lokal/Netz:    " + aPrinters[nX][3] +CRLF+;
           "Modell:        " + aPrinters[nX][4] +CRLF+;
           "Freigabename:  " + aPrinters[nX][5] +CRLF+ ;  
           "Status :       " + STR ( PrnStatus( aPrinters[nX][2]+":" ) )  
  MsgInfo (cPrn)
Next

RETURN (nil)
kind regards

Stefan
Posts: 392
Joined: Tue Mar 10, 2009 11:54 AM
Re: Printers
Posted: Wed Jun 03, 2009 08:41 AM

Hello Stefan,

getting always 4096 for all printers, network AND local!

Windows 11 Pro 22H2 22621.1848

Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384

Harbour 3.2.0dev (r2008190002)

FWH 23.10 x86
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: Printers
Posted: Wed Jun 03, 2009 10:33 AM

Hello Frank,

I have the same results as you. If I try – I have a VISTA system – with the printername as parameter I get the correct results.

Best regards,
Otto

Posts: 392
Joined: Tue Mar 10, 2009 11:54 AM
Re: Printers
Posted: Wed Jun 03, 2009 10:59 AM

Hello Stefan, hello Otto,

even with 'aPrinters[nX][1]' the return value is always 4096!

Windows 11 Pro 22H2 22621.1848

Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384

Harbour 3.2.0dev (r2008190002)

FWH 23.10 x86
Posts: 824
Joined: Thu Oct 13, 2005 07:39 AM
Re: Printers
Posted: Thu Jun 04, 2009 07:23 AM
Hi all,

the correct parameter for PrnStatus () is the printer name, not the port !

If specify a real printer name, the function returns 0 (PRINTER_STATUS_OK). But it does not return the real status of the printer. Windows can not get the correct status of a printer, if no jobs are in it´s queue.

This is what I found in the web about this issue:

To further complicate things, it turns out that Windows only queries the printer for its status when there's a print job for the it, which means that if you are not printing you probably can't find out the real printer status. If you are not concerned about this, you'll be glad to know that you can obtain the same information on WinNT and Win9x by querying the print job instead of the printer for the status, via the GetJob() api.


I think, windows should do the job, it´s not DOS anymore. Windows tells us, if there are errors while printing. In our applications it is enough to check if a printer exists or not.


This is a modified version of PrnStatus, which return a correct error code if the printer does not exist.

Code (fw): Select all Collapse
#define ERROR_INVALID_PRINTER_NAME  1801

FUNCTION CheckStatus (cPrinter)

LOCAL nStatus := PrinterStatus (cPrinter)
LOCAL cStatus := IIF (nStatus = ERROR_INVALID_PRINTER_NAME, ;
                                "Invalid Printer name", STR (nStatus) )

RETURN (cStatus)



#pragma BEGINDUMP


#include <Windows.h>
#include <HbApi.h>


HB_FUNC ( PRINTERSTATUS ) // cPrinter or cPrinterServer --> nStatus
{
  HANDLE hPrinter = NULL;
  DWORD cBytesNeeded = 0, cBytesUsed = 0, pstatus = -1;
  PRINTER_INFO_2 * pPrinterInfo = NULL;

   if( OpenPrinter( hb_parc( 1 ), &hPrinter, NULL ) )
   {
      GetPrinter( hPrinter, 2, NULL, 0, &cBytesNeeded );
      pPrinterInfo = ( PRINTER_INFO_2 * ) hb_xgrab( cBytesNeeded );
      //cBytesUsed = cBytesNeeded;
      GetPrinter( hPrinter, 2, ( unsigned char * ) pPrinterInfo, cBytesNeeded, &cBytesUsed );
      pstatus = (pPrinterInfo->Status) ;
      hb_retnl( pPrinterInfo->Status ) ;
      hb_xfree( pPrinterInfo );
      ClosePrinter( hPrinter );

   }
   else
      hb_retnl( GetLastError() );  // return error code if Openprinter() fails
}
kind regards

Stefan

Continue the discussion