Как получить состояние принтера и задания печати

Переводы статьи Переводы статьи
Код статьи: 160129 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Обновить состояние задания на печать и принтеры диспетчером очереди Win32 во время despool задания печати. В остальное время, когда этот принтер будет считается не despooling и отчеты не сведений о состоянии принтера Чтобы быть готовы и простоя.

Дополнительная информация

Как обращаться к Win32 API, «принтер» состоит из принтера драйвер, очередь печати и пути ввода вывода для физического принтера. Операционная система обрабатывает физический принтер как просто назначения Задание печати созданных и передается через систему «Принтер», ссылка на в оставшейся части статьи в качестве принтера.

Наиболее видимой частью принтера является очередью печати. Он управляется Печать Manager или папки принтеров в пользовательский стиль Windows 95 интерфейсы. Драйвер принтера — это интерфейс для принтера, используемого приложениями для создания задания на печать через принтер контроллеры домена. Пути ввода-вывода для Принтер состоит из нескольких слоев системного кода, culminating с портом монитор.

Монитор порта — это интерфейс физического принтера в списке- отвечает за передачу данных и потока конец системный принтер задания печати через любое подключение существует физического принтера. В случае использования принтеров двунаправленного бы монитора порта ответственность за передачу данных из физического принтера. Это подключение и физический принтер, где возникают ошибки. Это задание Монитор порта этих ошибках.

Диспетчер очереди печати не запрашивать состояние физического принтера, к которому Принтер. Вместо этого определяет состояние физического принтера Успешное выполнение задания печати во время его despooled через порт монитор. Если происходят ошибки в этом процессе, ошибка порт монитора и записываются в сведения о состоянии задания печати. Диспетчер очереди печати в свою очередь распространяет информацию разумные ошибки в очередь принтера.

Таким образом система принтера сообщает без состояния, когда очередь принтера пустой. В этом состоянии подразумевается готовы принимать задания печати принтера. Это допустимый допущения, даже в том случае, если физического принтера произошла ошибка состояние таких как в автономном режиме. Операционная система рассматривает принтер готов к Прием заданий печати, даже в том случае, если по каким-то причинам не может завершить доставку физический принтер. Такая ситуация считается в состоянии ошибки операционная система, должны быть адресованы пользователю. Это не рассматривается как ошибка reportable приложения, которые разрешено успешно завершите буферизация задания печати.

Определение состояния физического принтера

Имеется один основной предпосылкой, должны быть выполнены для определения состояния физический принтер: диспетчер очереди печати необходимо попытки отправить задание на печать на физическом принтере. Это состояние принтера — это только один раз сообщила, что монитор порта. Кроме того, наиболее значимой информации отображается состояние участников JOB_INFO Структура для этого задания печати, так как некоторые монитор порта будет эти значения напрямую.

В JOB_INFO содержит структуры Состояние член и pStatus член. Оба элементы содержат сведения о состоянии задания печати, вошедшими в монитор порта. Эти два члена отличаются тем, что Состояние член является битовым полем состояний, содержащая предварительно определенные значения, тогда как pStatus член является указателем на строку, которая может содержать что угодно. Эти значения документируются по Win32 SDK и файл заголовка WinSpool.h. В pStatus член, иногда, но не всегда присваивается строка описания состояния. Содержимое этой строки определяется каждый монитор порта.

JOB_INFO Возвращает структур двух функций API: GetJob и EnumJobs. EnumJobs возвращает массив JOB_INFO структуры, не требуя, что вызывающий объект ссылаются на индивидуальных заданий в очереди принтера. Задание печати, который в настоящее время despooling (печати) содержит сведения о состоянии. Чтобы найти это задание в массиве, поиск массив JOB_INFO структуры найдите задание печати, у которого состояние элемента JOB_STATUS_PRINTING бит set.

Проверка состояния является более простой метод определения состояния принтера член PRINTER_INFO Структура. Возвращаемые этой структуры GetPrinter функция. Имеется недостаток этого подхода в том, что не существует никаких pStatus строки члена в PRINTER_INFO Структура, которая может предоставить более подробные и обширные данные состояния. Однако есть преимущество в том, что монитор порта может установить некоторые расширенные принтера биты состояния PRINTER_INFO Структура. Обратите внимание, что монитор порта по умолчанию для Windows не устанавливает обычно больше, чем PRINTER_STATUS_ERROR бит элемента состояния принтера.

Обратите внимание на то, что статус элементов либо набор структур может содержать состояние Информация, которая не связана исключительно с физического принтера. Для Например, статус члена PRINTER_INFO структуры может быть установлено с PRINTER_STATUS_PAUSED -или- PRINTER_STATUS_PENDING_DELETION, который строго относящиеся к очереди печати. Кроме того, статус члена JOB_INFO Структура может содержать значения состояния JOB_STATUS_PAUSED -или- JOB_STATUS_DELETING, которые представляют интерес только для этого задания печати. Обратите внимание также, что после их despooled и остается с состоянием задания печати могут накапливаться в очереди печати JOB_STATUS_PRINTED.

Каждая из этих функций требуется дескриптор принтера для идентификации нужный принтер. Этот дескриптор получается из OpenPrinter функция, которая принимает строку, содержащую имя принтера. Это имя может быть локальное имя принтера или имя на сетевом принтере общего ресурса UNC.

В следующем примере кода демонстрируется вызов EnumJobs функция должным образом для извлечения JOB_INFO структуры и способов вызова GetPrinter функции для извлечения PRINTER_INFO структуры:

Пример кода

   BOOL GetJobs(HANDLE hPrinter,        /* Handle to the printer. */ 

                JOB_INFO_2 **ppJobInfo, /* Pointer to be filled.  */ 
                int *pcJobs,            /* Count of jobs filled.  */ 
                DWORD *pStatus)         /* Print Queue status.    */ 

   {

   DWORD               cByteNeeded,
                        nReturned,
                        cByteUsed;
    JOB_INFO_2          *pJobStorage = NULL;
    PRINTER_INFO_2       *pPrinterInfo = NULL;

   /* Get the buffer size needed. */ 
       if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
               return FALSE;
       }

       pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
       if (!(pPrinterInfo))
           /* Failure to allocate memory. */ 
           return FALSE;

       /* Get the printer information. */ 
       if (!GetPrinter(hPrinter,
               2,
               (LPSTR)pPrinterInfo,
               cByteNeeded,
               &cByteUsed))
       {
           /* Failure to access the printer. */ 
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }

       /* Get job storage space. */ 
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               NULL,
               0,
               (LPDWORD)&cByteNeeded,
               (LPDWORD)&nReturned))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
           {
               free(pPrinterInfo);
               pPrinterInfo = NULL;
               return FALSE;
           }
       }

       pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
       if (!pJobStorage)
       {
           /* Failure to allocate Job storage space. */ 
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }

       ZeroMemory(pJobStorage, cByteNeeded);

       /* Get the list of jobs. */ 
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               (LPBYTE)pJobStorage,
               cByteNeeded,
               (LPDWORD)&cByteUsed,
               (LPDWORD)&nReturned))
       {
           free(pPrinterInfo);
           free(pJobStorage);
           pJobStorage = NULL;
           pPrinterInfo = NULL;
           return FALSE;
       }

       /*
        *  Return the information.
        */ 
       *pcJobs = nReturned;
       *pStatus = pPrinterInfo->Status;
       *ppJobInfo = pJobStorage;
       free(pPrinterInfo);

       return TRUE;

   }

   BOOL IsPrinterError(HANDLE hPrinter)
   {

       JOB_INFO_2  *pJobs;
       int         cJobs,
                   i;
       DWORD       dwPrinterStatus;

       /*
        *  Get the state information for the Printer Queue and
        *  the jobs in the Printer Queue.
        */ 
       if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
			return FALSE;

       /*
        *  If the Printer reports an error, believe it.
        */ 
       if (dwPrinterStatus &
           (PRINTER_STATUS_ERROR |
           PRINTER_STATUS_PAPER_JAM |
           PRINTER_STATUS_PAPER_OUT |
           PRINTER_STATUS_PAPER_PROBLEM |
           PRINTER_STATUS_OUTPUT_BIN_FULL |
           PRINTER_STATUS_NOT_AVAILABLE |
           PRINTER_STATUS_NO_TONER |
           PRINTER_STATUS_OUT_OF_MEMORY |
           PRINTER_STATUS_OFFLINE |
           PRINTER_STATUS_DOOR_OPEN))
       {
           free( pJobs );
           return TRUE;
       }

       /*
        *  Find the Job in the Queue that is printing.
        */ 
       for (i=0; i < cJobs; i++)
       {
           if (pJobs[i].Status & JOB_STATUS_PRINTING)
           {
               /*
                *  If the job is in an error state,
                *  report an error for the printer.
                *  Code could be inserted here to
                *  attempt an interpretation of the
                *  pStatus member as well.
                */ 
               if (pJobs[i].Status &
                   (JOB_STATUS_ERROR |
                   JOB_STATUS_OFFLINE |
                   JOB_STATUS_PAPEROUT |
                   JOB_STATUS_BLOCKED_DEVQ))
               {
                   free( pJobs );
                   return TRUE;
               }
           }
       }

       /*
        *  No error condition.
        */ 
       free( pJobs );
       return FALSE;

   }
				
ПРИМЕЧАНИЕ: При включении группировку принтеров в Windows NT может быть despooling более одного задания печати из очереди принтера, который будет сообщать о состоянии. Этот пример кода не учитывает решения этой проблемы.

Ссылки

Для получения дополнительных сведений о общие инструкции на вызов функций Win32 диспетчера очереди печати щелкните следующий номер статьи базы знаний Майкрософт:
158828Как диспетчер очереди Wind32 вызова API перечисления должным образом

Свойства

Код статьи: 160129 - Последний отзыв: 3 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Win32 Application Programming Interface на следующих платформах
    • операционная система Microsoft Windows NT Server 3.51
    • Microsoft Windows NT Server 4.0 Standard Edition
    • операционная система Microsoft Windows NT Workstation 3.51
    • Microsoft Windows NT Workstation 4.0 Developer Edition
    • Операционная система Microsoft Windows 95
Ключевые слова: 
kbFAQ kbhowto kbmt KB160129 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:160129

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com