PRINTER_INFO_6无法使用WIn32 api

问题描述 投票:0回答:1

我一直在尝试从DNP rx1打印机获取打印机状态,但是当我打开打印机的纸盘时,打印机的状态不会改变。这是一个使用py32win库访问状态的示例,当托盘打开时,它总是返回status = 0事件。

device_name = win32print.GetDefaultPrinter()
handle = win32print.OpenPrinter(device_name)

# Get the default properties for the printer
properties = win32print.GetPrinter(handle, 2)

[当我尝试win32print.GetPrinter(handle, 6) # 6 = print_info_6时,出现一些NotImplementedException。因此,我的猜测是打印机的固件尚未实现print_info_6。因此我无法从打印机获取状态

我也尝试过将Powershell与:

Get-Printer | Select Name, PrinterStatus

打开纸盒或发生卡纸时,状态也不会改变。

我有什么要注意的吗?我还能尝试获取打印机的状态吗?

winapi printing pywin32
1个回答
0
投票

[PRINTER_INFO_6在具有OneNote打印机的Windows 10 1903上为我在C ++中工作。

PRINTER_INFO_6

并且当我暂停打印机时,我的状态为enter image description here0x00000001)。

PRINTER_STATUS_PAUSED

我用于测试的C ++代码。

enter image description here

我在测试中发现的一些问题:

  1. [P0状态]在#pragma comment(lib, "Winspool") int main() { DWORD bufSize; WCHAR* buf = NULL; HANDLE hPrinter = NULL; PRINTER_INFO_6 info = {}; DWORD needed; BOOL result = FALSE; DWORD err; // Get required buffer size result = GetDefaultPrinter(NULL, &bufSize); if(!result) { err = GetLastError(); if (ERROR_INSUFFICIENT_BUFFER != err) { std::cout << "GetDefaultPrinter failed with error: \n" << GetLastError(); return 0; } } buf = (WCHAR*)calloc(bufSize, sizeof(WCHAR)); result = GetDefaultPrinter(buf, &bufSize); if (!result) { std::cout << "GetDefaultPrinter failed with error: \n" << GetLastError(); return 0; } std::wcout << "Printer name: " << buf << "\n"; result = OpenPrinter(buf, &hPrinter, NULL); if (!result) { std::cout << "OpenPrinter failed with error: \n" << GetLastError(); return 0; } result = GetPrinter(hPrinter, 6, (LPBYTE)&info, sizeof(PRINTER_INFO_6), &needed); if (!result) { err = GetLastError(); if (ERROR_INSUFFICIENT_BUFFER != err) { std::cout << "GetPrinter failed with error: \n" << GetLastError(); return 0; } } BYTE* statBuf = (BYTE*)calloc(needed, sizeof(BYTE)); result = GetPrinter(hPrinter, 6, statBuf, needed, &needed); if (!result) { std::cout << "GetPrinter failed with error: \n" << GetLastError(); return 0; } std::cout << "Printer status (low 32bit): " << *((DWORD*)statBuf) << "\n"; statBuf += sizeof(DWORD); std::cout << "Printer status (high 32bit): " << *((DWORD*)statBuf) << "\n"; getchar(); } 中定义为DWORD(4个字节),但PRINTER_INFO_6 structure为此要求8个字节(PRINTER_INFO_6)。因此,当您将GetPrinter结构作为needed == 8参数传递时,会出现ERROR_INSUFFICIENT_BUFFER错误。
  2. 仅定义了PRINTER_INFO_6,但没有在pPrinter中提及PRINTER_INFO_6(Unicode)和_PRINTER_INFO_6W(ANSI)。
© www.soinside.com 2019 - 2024. All rights reserved.