我的目标是确定打印机的当前状态。我找到了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
选项,但它没有帮助。
我做错了什么?
答案 0 :(得分:4)
此脱机状态(是的,有多个)实际上并未存储为状态位,而是存储为pPrnInfo2-&gt;属性中的PRINTER_ATTRIBUTE_WORK_OFFLINE位。请参阅this KB article。
它由用于USB打印机的USB端口监视器(USBMON)设置,但也可以通过“使用打印机离线”菜单选项在“查看打印”窗口中由用户打开或关闭:
仅供参考,这是此属性在Windows 10中的各个位置显示的状态字符串:
其他脱机状态标记位置为:
请注意,每台打印机的确切状态行为都取决于驱动程序,因为驱动程序可以设置它喜欢的任何状态。例如,我不记得看到网络打印机使用PRINTER_ATTRIBUTE_WORK_OFFLINE,但我最近看到Epson收据打印机使用PRINTER_STATUS_NOT_AVAILABLE。