尝试确定离线和在线打印机的打印机状态总是 returns 0
Trying to determine printer status always returns 0 for offline & online printers
我的目标是确定打印机的当前状态。我找到了 following code。这是一个稍微修改过的版本,用于修复内存泄漏和错误:
#include <Winspool.h>
int GetPrinterStatus( char* szPrnName )
{
HANDLE hHandle = 0; // Handle of the printer
DWORD dwStatus = 0; // Printer status we should receive
DWORD dwSize = 0; // Size of memory we should
// allocate for PRINTER_INFO_2
PRINTER_INFO_2* pPrnInfo2 = 0; // Structure specifies detailed
// printer information
DEVMODE DevMode = {0}; // Structure contains information
// about the device initialization
// and environment of a printer
PRINTER_DEFAULTS PrnDef = { 0, &DevMode, PRINTER_ACCESS_USE };
// Open printer with name szPrnName
if( !OpenPrinter( szPrnName, &hHandle, &PrnDef ) )
return -1; // Error
// How many memory should be allocated for printer data?
GetPrinter( hHandle, 2, 0, 0, &dwSize );
if( !dwSize )
{
ClosePrinter( hHandle );
return -1; // Error
}
// Allocate memory
pPrnInfo2 = (PRINTER_INFO_2*)malloc( dwSize );
// Receive printer details
if(!GetPrinter( hHandle, 2, (LPBYTE)pPrnInfo2, dwSize, &dwSize ))
{
ClosePrinter( hHandle );
free( pPrnInfo2 );
return -1; // Error
}
dwStatus = pPrnInfo2->Status;
// Free allocated memory
free( pPrnInfo2 );
// Close printer
ClosePrinter( hHandle );
return dwStatus;
}
所以当我运行它用于这台打印机时,即offline
:
像这样:
int status = GetPrinterStatus("POS58");
我收到的状态是0
,这和我为功能打印机调用它时完全一样
然后我尝试用 OpenPrinter2W
替换 OpenPrinter
调用并使用 PRINTER_OPTION_NO_CACHE
选项,但它没有帮助。
我做错了什么?
这个离线状态(是的,不止一个)实际上并没有作为状态位存储,而是作为 pPrnInfo2->Attributes 中的 PRINTER_ATTRIBUTE_WORK_OFFLINE 位存储。参见 this KB article。
它由 USB 打印机的 USB 端口监视器 (USBMON) 设置,但也可以由用户在 "See what's printing" window 中通过 "Use Printer Offline" 打开或关闭菜单选项:
仅供参考,这是此属性在 Windows 10 的各个位置显示的状态字符串:
- 在打印管理中(还有您的打印 window)- "Offline"
- 设备和打印机详细信息视图,状态为 -“”(空字符串)
- "See what's printing" window 来自设备和打印机 - "Use Printer Offline"
其他离线状态标志位置是:
- PRINTER_STATUS_OFFLINE - 您对打印机信息状态的期望
- JOB_STATUS_OFFLINE - 处于作业状态(通常是当前正在打印的作业)
请注意,每台打印机的确切状态行为取决于驱动程序,因为驱动程序可以设置它喜欢的任何状态。例如,我不记得看到网络打印机使用 PRINTER_ATTRIBUTE_WORK_OFFLINE,但我最近看到爱普生收据打印机使用 PRINTER_STATUS_NOT_AVAILABLE。
我的目标是确定打印机的当前状态。我找到了 following code。这是一个稍微修改过的版本,用于修复内存泄漏和错误:
#include <Winspool.h>
int GetPrinterStatus( char* szPrnName )
{
HANDLE hHandle = 0; // Handle of the printer
DWORD dwStatus = 0; // Printer status we should receive
DWORD dwSize = 0; // Size of memory we should
// allocate for PRINTER_INFO_2
PRINTER_INFO_2* pPrnInfo2 = 0; // Structure specifies detailed
// printer information
DEVMODE DevMode = {0}; // Structure contains information
// about the device initialization
// and environment of a printer
PRINTER_DEFAULTS PrnDef = { 0, &DevMode, PRINTER_ACCESS_USE };
// Open printer with name szPrnName
if( !OpenPrinter( szPrnName, &hHandle, &PrnDef ) )
return -1; // Error
// How many memory should be allocated for printer data?
GetPrinter( hHandle, 2, 0, 0, &dwSize );
if( !dwSize )
{
ClosePrinter( hHandle );
return -1; // Error
}
// Allocate memory
pPrnInfo2 = (PRINTER_INFO_2*)malloc( dwSize );
// Receive printer details
if(!GetPrinter( hHandle, 2, (LPBYTE)pPrnInfo2, dwSize, &dwSize ))
{
ClosePrinter( hHandle );
free( pPrnInfo2 );
return -1; // Error
}
dwStatus = pPrnInfo2->Status;
// Free allocated memory
free( pPrnInfo2 );
// Close printer
ClosePrinter( hHandle );
return dwStatus;
}
所以当我运行它用于这台打印机时,即offline
:
像这样:
int status = GetPrinterStatus("POS58");
我收到的状态是0
,这和我为功能打印机调用它时完全一样
然后我尝试用 OpenPrinter2W
替换 OpenPrinter
调用并使用 PRINTER_OPTION_NO_CACHE
选项,但它没有帮助。
我做错了什么?
这个离线状态(是的,不止一个)实际上并没有作为状态位存储,而是作为 pPrnInfo2->Attributes 中的 PRINTER_ATTRIBUTE_WORK_OFFLINE 位存储。参见 this KB article。
它由 USB 打印机的 USB 端口监视器 (USBMON) 设置,但也可以由用户在 "See what's printing" window 中通过 "Use Printer Offline" 打开或关闭菜单选项:
仅供参考,这是此属性在 Windows 10 的各个位置显示的状态字符串:
- 在打印管理中(还有您的打印 window)- "Offline"
- 设备和打印机详细信息视图,状态为 -“”(空字符串)
- "See what's printing" window 来自设备和打印机 - "Use Printer Offline"
其他离线状态标志位置是:
- PRINTER_STATUS_OFFLINE - 您对打印机信息状态的期望
- JOB_STATUS_OFFLINE - 处于作业状态(通常是当前正在打印的作业)
请注意,每台打印机的确切状态行为取决于驱动程序,因为驱动程序可以设置它喜欢的任何状态。例如,我不记得看到网络打印机使用 PRINTER_ATTRIBUTE_WORK_OFFLINE,但我最近看到爱普生收据打印机使用 PRINTER_STATUS_NOT_AVAILABLE。