В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

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

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:160129
Аннотация
Обновить состояние задания на печать и принтеры диспетчером очереди 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 перечисления должным образом
GdiSpool

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 160129 — последний просмотр: 06/03/2011 11:24:00 — редакция: 4.0

Microsoft Win32 Application Programming Interface

  • kbFAQ kbhowto kbmt KB160129 KbMtru
Отзывы и предложения
html>