Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
PrintStatus() always returns .T.
Message
 
 
À
16/03/2007 10:24:03
Information générale
Forum:
Visual FoxPro
Catégorie:
Gestionnaire de rapports & Rapports
Versions des environnements
Visual FoxPro:
VFP 9 SP1
OS:
Windows XP SP2
Divers
Thread ID:
01204202
Message ID:
01204547
Vues:
29
>I tried your code and the printstatus return 3 (idle) for all printers, including my local printer which is disconnected OFF. Then it seems the status is not exact at all, not more than native vfp PrintStatus() or Sys(13) functions. What is the problem here?

I got the same result as you. Something is wrong here. Then I tried another way supplied by Murad Tchary in the referenced thread:
LOCAL laPrinters[1], lnI
=APRINTERS(laPrinters)
FOR lnI = 1 TO ALEN(laPrinters,1)
	=MESSAGEBOX(laPrinters[m.lnI] + " Status: " + GetPrinterStatus(laPrinters[m.lnI]))
NEXT

* FUNCTION GetPrinterStatus(tcPrinterName)
* Date       :   05/24/2006
* Author     :   Murad Tchary
* Description:  Returns printer status
****** PARAMETERS **************
* Parameters :  1
* Parameter 1:  Name of the printer
*
*******************************************
FUNCTION GetPrinterStatus
LPARAMETERS tcPrinterName

*-- Printer status flags used with PRINTER_INFORMATION_2
#DEFINE cnPRINTER_STATUS_OFFSET 73
#DEFINE cnPRINTER_STATUS_READY								 0x00000000
#DEFINE cnPRINTER_STATUS_PAUSED								 0x00000001
#DEFINE cnPRINTER_STATUS_ERROR								 0x00000002
#DEFINE cnPRINTER_STATUS_PENDING_DELETION 					 0x00000004
#DEFINE cnPRINTER_STATUS_PAPER_JAM 							 0x00000008
#DEFINE cnPRINTER_STATUS_PAPER_OUT 							 0x00000010
#DEFINE cnPRINTER_STATUS_MANUAL_FEED 						 0x00000020
#DEFINE cnPRINTER_STATUS_PAPER_PROBLEM 						 0x00000040
#DEFINE cnPRINTER_STATUS_OFFLINE 							 0x00000080
#DEFINE cnPRINTER_STATUS_IO_ACTIVE 							 0x00000100
#DEFINE cnPRINTER_STATUS_BUSY 								 0x00000200
#DEFINE cnPRINTER_STATUS_PRINTING 							 0x00000400
#DEFINE cnPRINTER_STATUS_OUTPUT_BIN_FULL 					 0x00000800
#DEFINE cnPRINTER_STATUS_NOT_AVAILABLE						 0x00001000
#DEFINE cnPRINTER_STATUS_WAITING 							 0x00002000
#DEFINE cnPRINTER_STATUS_PROCESSING 						 0x00004000
#DEFINE cnPRINTER_STATUS_INITIALIZING						 0x00008000
#DEFINE cnPRINTER_STATUS_WARMING_UP 						 0x00010000
#DEFINE cnPRINTER_STATUS_TONER_LOW 							 0x00020000
#DEFINE cnPRINTER_STATUS_NO_TONER 							 0x00040000
#DEFINE cnPRINTER_STATUS_PAGE_PUNT 							 0x00080000
#DEFINE cnPRINTER_STATUS_USER_INTERVENTION 					 0x00100000
#DEFINE cnPRINTER_STATUS_OUT_OF_MEMORY						 0x00200000
#DEFINE cnPRINTER_STATUS_DOOR_OPEN 							 0x00400000
#DEFINE cnPRINTER_STATUS_SERVER_UNKNOWN 					 0x00800000
#DEFINE cnPRINTER_STATUS_POWER_SAVE 						 0x01000000


DECLARE INTEGER GetPrinter IN winspool.drv AS GetPrinterA INTEGER hPrinter, INTEGER Lvl, STRING @pPrinter, INTEGER cbBuf, INTEGER @pcbNeeded
DECLARE INTEGER OpenPrinter IN winspool.drv AS OpenPrinterA STRING pPrinterName, INTEGER @phPrinter, INTEGER pDefault
DECLARE INTEGER ClosePrinter IN winspool.drv AS ClosePrinterA INTEGER hPrinter

LOCAL lcPrinterInfo
LOCAL lcPrinterStatus

LOCAL lnResult
LOCAL lnPrinterStatus
LOCAL lnHandle
LOCAL lnBufferSize
LOCAL lnBytesUsed

lcPrinterStatus = ''
lnHandle 	    = 0

lnResult	    = OpenPrinterA(tcPrinterName, @lnHandle, 0)

IF lnResult # 0
	lnBufferSize  = 4096
	lcPrinterInfo = REPLICATE(CHR(0), lnBufferSize)

	lnResult	  = GetPrinterA(lnHandle, 2, @lcPrinterInfo, lnBufferSize, @lnBytesUsed)

	IF lnResult # 0

		lnPrinterStatus = INT(Buf2DWord(SUBSTR(lcPrinterInfo, cnPRINTER_STATUS_OFFSET, 4)))

		DO CASE
		CASE lnPrinterStatus = cnPRINTER_STATUS_READY
			lcPrinterStatus = 'Ready'

		CASE lnPrinterStatus = cnPRINTER_STATUS_PAUSED
			lcPrinterStatus = 'Paused'

		CASE lnPrinterStatus = cnPRINTER_STATUS_ERROR
			lcPrinterStatus = 'Error'

		CASE lnPrinterStatus = cnPRINTER_STATUS_PENDING_DELETION
			lcPrinterStatus = 'Deleting...'

		CASE lnPrinterStatus = cnPRINTER_STATUS_PAPER_JAM
			lcPrinterStatus = 'Paper Jam'

		CASE lnPrinterStatus = cnPRINTER_STATUS_PAPER_OUT
			lcPrinterStatus = 'Paper Out'

		CASE lnPrinterStatus = cnPRINTER_STATUS_MANUAL_FEED
			lcPrinterStatus = 'Manual Feed Required'

		CASE lnPrinterStatus = cnPRINTER_STATUS_PAPER_PROBLEM
			lcPrinterStatus = 'Paper Problem'

		CASE lnPrinterStatus = cnPRINTER_STATUS_OFFLINE
			lcPrinterStatus = 'Offline'

		CASE lnPrinterStatus = cnPRINTER_STATUS_IO_ACTIVE
			lcPrinterStatus = 'Downloading Job'

		CASE lnPrinterStatus = cnPRINTER_STATUS_BUSY
			lcPrinterStatus = 'Busy'

		CASE lnPrinterStatus = cnPRINTER_STATUS_PRINTING
			lcPrinterStatus = 'Printing'

		CASE lnPrinterStatus = cnPRINTER_STATUS_OUTPUT_BIN_FULL
			lcPrinterStatus = 'Output Bill Full'

		CASE lnPrinterStatus = cnPRINTER_STATUS_NOT_AVAILABLE
			lcPrinterStatus = 'Not Available'

		CASE lnPrinterStatus = cnPRINTER_STATUS_WAITING
			lcPrinterStatus = 'Waiting'

		CASE lnPrinterStatus = cnPRINTER_STATUS_PROCESSING
			lcPrinterStatus = 'Processing Job'

		CASE lnPrinterStatus = cnPRINTER_STATUS_INITIALIZING
			lcPrinterStatus = 'Initializing'

		CASE lnPrinterStatus = cnPRINTER_STATUS_WARMING_UP
			lcPrinterStatus = 'Warming Up'

		CASE lnPrinterStatus = cnPRINTER_STATUS_TONER_LOW
			lcPrinterStatus = 'Toner Low'

		CASE lnPrinterStatus = cnPRINTER_STATUS_NO_TONER
			lcPrinterStatus = 'Toner Out'

		CASE lnPrinterStatus = cnPRINTER_STATUS_PAGE_PUNT
			lcPrinterStatus = 'Page too Complex'

		CASE lnPrinterStatus = cnPRINTER_STATUS_USER_INTERVENTION
			lcPrinterStatus = 'User Intervention Required'

		CASE lnPrinterStatus = cnPRINTER_STATUS_OUT_OF_MEMORY
			lcPrinterStatus = 'Out of Memory'

		CASE lnPrinterStatus = cnPRINTER_STATUS_DOOR_OPEN
			lcPrinterStatus = 'Door Open'

		CASE lnPrinterStatus = cnPRINTER_STATUS_SERVER_UNKNOWN
			lcPrinterStatus = 'Unable to connect'

		CASE lnPrinterStatus = cnPRINTER_STATUS_POWER_SAVE
			lcPrinterStatus = 'Power Save Mode'

		OTHERWISE
			lcPrinterStatus = ALLTRIM(STR(lnPrinterStatus))
		ENDCASE

	ENDIF

	lnResult = ClosePrinterA(lnHandle)

ENDIF

RETURN lcPrinterStatus

FUNCTION Buf2DWord
LPARAMETER tcBuffer

LOCAL lnReturn

lnReturn = ASC(SUBSTR(tcBuffer, 1,1)) + ASC(SUBSTR(tcBuffer, 2,1)) * 256 + ASC(SUBSTR(tcBuffer, 3,1)) * 65536 + ASC(SUBSTR(tcBuffer, 4,1)) * 16777216

RETURN lnReturn
This returned Ready for one printer and no status for others... You may try it and see, if it's more reliable.
If it's not broken, fix it until it is.


My Blog
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform