|
HANDLE hPrint = dc.GetWindow ();
if (IsPrinterError (hPrint)) {
return 3;
}
BOOL IsPrinterError (HANDLE hPrinter)
{
Ranch
JOB_INFO_2 * pJobs;
int cJobs,
i;
DWORD dwPrinterStatus;
Ranch
/ *
* Get the state information for the Printer Queue and
* the jobs in the Printer Queue.
* /
if (! GetJobs (hPrinter,&pJobs,&cJobs,&dwPrinterStatus))
return FALSE;
Ranch
/ *
* If the Printer reports an error, believe it.
* /
if (dwPrinterStatus&
(PRINTER_STATUS_ERROR |
PRINTER_STATUS_PAPER_JAM |
PRINTER_STATUS_PAPER_OUT |
PRINTER_STATUS_PAPER_PROBLEM |
PRINTER_STATUS_OUTPUT_BIN_FULL |
PRINTER_STATUS_NOT_AVAILABLE |
PRINTER_STATUS_NO_TONER |
PRINTER_STATUS_OUT_OF_MEMORY |
PRINTER_STATUS_OFFLINE |
PRINTER_STATUS_DOOR_OPEN))
{
free (pJobs);
return TRUE;
}
Ranch
/ *
* Find the Job in the Queue that is printing.
* /
for (i = 0; i <cJobs; i ++)
{
if (pJobs [i] .Status&JOB_STATUS_PRINTING)
{
/ *
* If the job is in an error state,
* report an error for the printer.
* Code could be inserted here to
* attempt an interpretation of the
* pStatus member as well.
* /
if (pJobs [i] .Status&
(JOB_STATUS_ERROR |
JOB_STATUS_OFFLINE |
JOB_STATUS_PAPEROUT |
JOB_STATUS_BLOCKED_DEVQ))
{
free (pJobs);
return TRUE;
}
}
}
Ranch
/ *
* No error condition.
* /
free (pJobs);
return FALSE;
Ranch
}
BOOL GetJobs (HANDLE hPrinter, / * Handle to the printer. * /
JOB_INFO_2 ** ppJobInfo, / * Pointer to be filled. * /
int * pcJobs, / * Count of jobs filled. * /
DWORD * pStatus) / * Print Queue status. * /
{
Ranch
DWORD cByteNeeded,
nReturned,
cByteUsed;
JOB_INFO_2 * pJobStorage = NULL;
PRINTER_INFO_2 * pPrinterInfo = NULL;
Ranch
/ * Get the buffer size needed. * /
if (! GetPrinter (hPrinter, 2, NULL, 0,&cByteNeeded))
{
if (GetLastError ()! = ERROR_INSUFFICIENT_BUFFER)
return FALSE;
}
Ranch
pPrinterInfo = (PRINTER_INFO_2 *) malloc (cByteNeeded);
if (! (pPrinterInfo))
/ * Failure to allocate memory. * /
return FALSE;
Ranch
/ * Get the printer information. * /
if (! GetPrinter (hPrinter,
2,
(unsigned char *) pPrinterInfo,
cByteNeeded,
&cByteUsed))
{
/ * Failure to access the printer. * /
free (pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}
Ranch
/ * Get job storage space. * /
if (! EnumJobs (hPrinter,
0,
pPrinterInfo-> cJobs,
2,
NULL,
0,
(LPDWORD)&cByteNeeded,
(LPDWORD)&nReturned))
{
if (GetLastError ()! = ERROR_INSUFFICIENT_BUFFER)
{
free (pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}
}
Ranch
pJobStorage = (JOB_INFO_2 *) malloc (cByteNeeded);
if (! pJobStorage)
{
/ * Failure to allocate Job storage space. * /
free (pPrinterInfo);
pPrinterInfo = NULL;
return FALSE;
}
Ranch
ZeroMemory (pJobStorage, cByteNeeded);
Ranch
/ * Get the list of jobs. * /
if (! EnumJobs (hPrinter,
0,
pPrinterInfo-> cJobs,
2,
(LPBYTE) pJobStorage,
cByteNeeded,
(LPDWORD)&cByteUsed,
(LPDWORD)&nReturned))
{
free (pPrinterInfo);
free (pJobStorage);
pJobStorage = NULL;
pPrinterInfo = NULL;
return FALSE;
}
Ranch
/ *
* Return the information.
* /
* pcJobs = nReturned;
* pStatus = pPrinterInfo-> Status;
* ppJobInfo = pJobStorage;
free (pPrinterInfo);
Ranch
return TRUE;
Ranch
}
I don't know if this is right, I hope you all know what to do! !! |
|