2017-01-03 2 views
4

Моя цель - определить текущий статус принтера. Я нашел following code. Вот слегка измененная версия, чтобы исправить утечки памяти & ошибки:Попытка определить статус принтера всегда возвращает 0 для офлайновых и онлайн-принтеров

#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:

enter image description here

Как это:

int status = GetPrinterStatus("POS58"); 

Статус, который я получаю, равен 0, что точно так же, как когда я называю это для fu Направленный принтер

Я затем попытался заменить OpenPrinter на звонок с OpenPrinter2W и использовать опцию PRINTER_OPTION_NO_CACHE, но это не помогло.

Что я делаю неправильно?

ответ

4

Это состояние автономной работы (да, есть более одного) на самом деле не хранится как бит состояния, а как бит PRINTER_ATTRIBUTE_WORK_OFFLINE в pPrnInfo2-> Атрибуты. См. this KB article.

Он установлен монитор USB порт (USBMON) для принтера USB, но также может быть включена или выключена пользователем в «Посмотрите, что печать» окно с помощью пункта меню «Use Printer Offline»:

enter image description here

FYI, вот строка состояния этого атрибута показывает в различных местах в Windows 10:

  • в управлении печати (а также ваше окно печати) - "Offline"
  • De Пороки и принтеры просмотра подробной информации со статусом - «» (пустая строка)
  • «Посмотрите, что печать» окно от Устройства и принтеры - «Работать автономно»

В других местах форума государственные флаги:

  • PRINTER_STATUS_OFFLINE - То, что вы ожидали в статусе информации принтера
  • JOB_STATUS_OFFLINE - в состоянии работы (как правило, в настоящее время печати задания)

Обратите внимание, что точное поведение каждого принтера зависит от водителя, потому что драйвер может установить любой статус, который ему нравится. Например, я не помню, чтобы использовать сетевой принтер PRINTER_ATTRIBUTE_WORK_OFFLINE, но недавно я увидел, что принтер квитанции Epson использует PRINTER_STATUS_NOT_AVAILABLE.

+0

О, ничего себе. Благодарю. Также удивительно, что [документация для PRINTER_INFO_2] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd162845 (v = vs.85) .aspx) не упоминает флаг 'PRINTER_ATTRIBUTE_WORK_OFFLINE' :) Но это работает. Btw, [здесь] (http://stackoverflow.com/a/13005851/843732) другой пример кода для того же самого на SO. – c00000fd

+0

Нет проблем. Другие упоминания о SO на самом деле не покрывают всю сложность. Я только добавил примечание о поведении водителя и зафиксировал пару вещей. –

+0

Спасибо, этот ответ спас меня! Работает как шарм. –

Смежные вопросы