尝试确定打印机状态始终返回0表示离线&在线打印机

时间:2017-01-03 05:33:46

标签: c++ windows winapi printing windows-shell

我的目标是确定打印机的当前状态。我找到了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

enter image description here

像这样:

int status = GetPrinterStatus("POS58");

我收到的状态是0,这与我为功能打印机调用时的状态完全相同

然后我尝试用OpenPrinter2W替换OpenPrinter来电并使用PRINTER_OPTION_NO_CACHE选项,但它没有帮助。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

此脱机状态(是的,有多个)实际上并未存储为状态位,而是存储为pPrnInfo2-&gt;属性中的PRINTER_ATTRIBUTE_WORK_OFFLINE位。请参阅this KB article

它由用于USB打印机的USB端口监视器(USBMON)设置,但也可以通过“使用打印机离线”菜单选项在“查看打印”窗口中由用户打开或关闭:

The "Use Printer Offline" menu option

仅供参考,这是此属性在Windows 10中的各个位置显示的状态字符串:

  • 在“打印管理”(以及“打印”窗口)中 - “离线”
  • 设备和打印机详细信息视图,状态为“”“(空字符串)
  • 从设备和打印机“查看正在打印的内容”窗口 - “脱机使用打印机”

其他脱机状态标记位置为:

  • PRINTER_STATUS_OFFLINE - 您在打印机信息状态中的期望
  • JOB_STATUS_OFFLINE - 处于作业状态(通常是当前的打印作业)

请注意,每台打印机的确切状态行为都取决于驱动程序,因为驱动程序可以设置它喜欢的任何状态。例如,我不记得看到网络打印机使用PRINTER_ATTRIBUTE_WORK_OFFLINE,但我最近看到Epson收据打印机使用PRINTER_STATUS_NOT_AVAILABLE。