热情软件屋

 

打印资料时, 如何得到打印机的状态


编号:QA000881
建立日期: 1999年4月28日 最后修改日期:2002年4月2日
所属类别:

田雨:
    vb v5.0
    win95 & nt v4.0
    打印资料时, 如何得到打印机的状态? 例如, 打印前检测打印机是否联机, 打印后检测是否打印过程是否正常?

回答:

    你必须使用Windows API,具体步骤参考:微软的Knowledge Base的文章:“Q160129 OWTO: Get the Status of a Printer and a Print Job”。下面是部分例子:
     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. */
    
    
{
    
    
DWORD cByteNeeded,
    
nReturned,
    
cByteUsed;
    
JOB_INFO_2 *pJobStorage = NULL;
    
PRINTER_INFO_2 *pPrinterInfo = NULL;
    
    
/* Get the buffer size needed. */
    
if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
    
{
    
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
    
return FALSE;
    
}
    
    
pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
    
if (!(pPrinterInfo))
    
/* Failure to allocate memory. */
    
return FALSE;
    
    
/* Get the printer information. */
    
if (!GetPrinter(hPrinter,
    
2,
    
(LPSTR)pPrinterInfo,
    
cByteNeeded,
    
&cByteUsed))
    
{
    
/* Failure to access the printer. */
    
free(pPrinterInfo);
    
pPrinterInfo = NULL;
    
return FALSE;
    
}
    
    
/* 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;
    
}
    
}
    
    
pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
    
if (!pJobStorage)
    
{
    
/* Failure to allocate Job storage space. */
    
free(pPrinterInfo);
    
pPrinterInfo = NULL;
    
return FALSE;
    
}
    
    
ZeroMemory(pJobStorage, cByteNeeded);
    
    
/* 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;
    
}
    
    
/*
    
* Return the information.
    
*/
    
*pcJobs = nReturned;
    
*pStatus = pPrinterInfo->Status;
    
*ppJobInfo = pJobStorage;
    
free(pPrinterInfo);
    
    
return TRUE;
    
    
}
    
    
BOOL IsPrinterError(HANDLE hPrinter)
    
{
    
    
JOB_INFO_2 *pJobs;
    
int cJobs,
    
i;
    
DWORD dwPrinterStatus;
    
    
/*
    
* Get the state information for the Printer Queue and
    
* the jobs in the Printer Queue.
    
*/
    
if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
    
return FALSE;
    
    
/*
    
* 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))
    
{
    
return TRUE;
    
}
    
    
/*
    
* 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))
    
{
    
return TRUE;
    
}
    
}
    
}
    
    
/*
    
* No error condition.
    
*/
    
return FALSE;
    
    
}
    

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio