PRINTER_INFO_6 недоступен при использовании API-интерфейса WIn32 - PullRequest
0 голосов
/ 17 января 2020

Я пытался получить состояние принтера от принтера 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

Также нет изменений в статусе, когда я открываю лоток или есть бумага варенье.

Есть что-нибудь, что я пропускаю? Есть ли что-нибудь еще, что я могу попытаться узнать о состоянии принтера?

1 Ответ

0 голосов
/ 17 января 2020

PRINTER_INFO_6 у меня работает в C ++ на Windows 10 1903 с принтером OneNote.

enter image description here

И когда Я приостанавливаю работу принтера и получаю статус 0x00000001 ( PRINTER_STATUS_PAUSED ).

enter image description here

Код 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, определенное как DWORD (4 байта) в PRINTER_INFO_6 структуре , но GetPrinter требует 8 байт для этого (needed == 8). Таким образом, вы получите ошибку ERROR_INSUFFICIENT_BUFFER при передаче структуры PRINTER_INFO_6 в качестве параметра pPrinter.
  2. Определено только PRINTER_INFO_6, но нет _PRINTER_INFO_6W (Unicode) и _PRINTER_INFO_6A (ANSI) упомянутый в документе .
...