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();
}

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

  1. Pinter 状态在 PRINTER_INFO_6 structure 中定义为 DWORD(4 个字节),但 GetPrinter 需要 8 个字节(needed == 8)。因此,当您将 PRINTER_INFO_6 结构作为 pPrinter 参数传递时,您将收到 ERROR_INSUFFICIENT_BUFFER 错误。
  2. document.
  3. 中只定义了PRINTER_INFO_6,没有_PRINTER_INFO_6W(Unicode)和_PRINTER_INFO_6A(ANSI)