PRINTER_INFO_6 无法使用 WIn32 api
PRINTER_INFO_6 not available using WIn32 api
我一直在尝试从 DNP rx1 打印机获取打印机状态,但是当我打开打印机的托盘时,打印机的状态并没有改变。这是一个使用 py32win 库访问状态的示例,当托盘打开时它总是 return 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
当我打开纸盘或出现卡纸时,状态也没有变化。
有什么我忽略的地方吗?还有什么我可以尝试获取打印机状态的吗?
PRINTER_INFO_6
在 Windows 10 1903 使用 OneNote 打印机在 C++ 中为我工作。
当我暂停打印机时,我得到状态 0x00000001
(PRINTER_STATUS_PAUSED).
我用来测试的C++代码。
#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();
}
我在测试中发现的一些问题:
- Pinter 状态在
PRINTER_INFO_6
structure 中定义为 DWORD
(4 个字节),但 GetPrinter
需要 8 个字节(needed == 8
)。因此,当您将 PRINTER_INFO_6
结构作为 pPrinter
参数传递时,您将收到 ERROR_INSUFFICIENT_BUFFER
错误。
- document.
中只定义了PRINTER_INFO_6
,没有_PRINTER_INFO_6W
(Unicode)和_PRINTER_INFO_6A
(ANSI)
我一直在尝试从 DNP rx1 打印机获取打印机状态,但是当我打开打印机的托盘时,打印机的状态并没有改变。这是一个使用 py32win 库访问状态的示例,当托盘打开时它总是 return 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
当我打开纸盘或出现卡纸时,状态也没有变化。
有什么我忽略的地方吗?还有什么我可以尝试获取打印机状态的吗?
PRINTER_INFO_6
在 Windows 10 1903 使用 OneNote 打印机在 C++ 中为我工作。
当我暂停打印机时,我得到状态 0x00000001
(PRINTER_STATUS_PAUSED).
我用来测试的C++代码。
#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();
}
我在测试中发现的一些问题:
- Pinter 状态在
PRINTER_INFO_6
structure 中定义为DWORD
(4 个字节),但GetPrinter
需要 8 个字节(needed == 8
)。因此,当您将PRINTER_INFO_6
结构作为pPrinter
参数传递时,您将收到ERROR_INSUFFICIENT_BUFFER
错误。 - document. 中只定义了
PRINTER_INFO_6
,没有_PRINTER_INFO_6W
(Unicode)和_PRINTER_INFO_6A
(ANSI)