Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как получить информацию из очереди печати принтера

58K
03 марта 2012 года
Agronomchek
8 / / 24.08.2010
Товарищи!

Может кто доходчиво объяснить как правильно использовать функцию GetPrinter(), или каким еще образом можно получать информацию о состоянии принтера из очереди печати, если не с помощью WinAPI?


Или может кто сможет объяснить почему вываливается ошибка в этом коде примера использования с сайта MSDN:

invalid conversion from 'CHAR*' to 'BYTE'

ругается на указатель &cByteUsed


Код:
#include <windows.h>
#include <iostream>

using namespace std;

BOOL GetJobs(HANDLE hPrinter,        /* Дескриптор принтера. */
             JOB_INFO_2 **ppJobInfo, /* Указатель который будем заполнять.  */
             int *pcJobs,            /* Счётчик заданий.  */
             DWORD *pStatus)         /* Состояние очереди печати.    */
{
    DWORD cByteNeeded,
            nReturned,
            cByteUsed;
    JOB_INFO_2 *pJobStorage = NULL;
    PRINTER_INFO_2 *pPrinterInfo = NULL;

    /* Получаем необходимый размер буфера. */
    if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
    {
        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
            return FALSE;
    }
    pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
    if (!(pPrinterInfo))
        /* Ошибка выделения памяти. */
          return FALSE;

      /* Получаем информацию о принтере. */
      if (!GetPrinter(hPrinter,
                      2,
                      (LPSTR)pPrinterInfo,
                      cByteNeeded,
                      &cByteUsed))                               /* <---------------ВОТ ТУТ */
      {
          /* Ошибка доступа к принтеру. */
          free(pPrinterInfo);
          pPrinterInfo = NULL;
          return FALSE;
      }

      /* Получаем необходимы размер для заданий. */
      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)
      {
          /* Ошибка выделения памяти для информации о заданиях. */
          free(pPrinterInfo);
          pPrinterInfo = NULL;
          return FALSE;
      }

      ZeroMemory(pJobStorage, cByteNeeded);

      /* Получаем список заданий. */
      if (!EnumJobs(hPrinter,
                    0,
                    pPrinterInfo->cJobs,
                    2,
                    (LPBYTE)pJobStorage,
                    cByteNeeded,
                    (LPDWORD)&cByteUsed,
                    (LPDWORD)&nReturned))
      {
          free(pPrinterInfo);
          free(pJobStorage);
          pJobStorage = NULL;
          pPrinterInfo = NULL;
          return FALSE;
      }

      /*
       *  Возвращаем информацию.
       */

      *pcJobs = nReturned;
      *pStatus = pPrinterInfo->Status;
      *ppJobInfo = pJobStorage;
      free(pPrinterInfo);

      return TRUE;

  }

  BOOL IsPrinterError(HANDLE hPrinter)
  {
      JOB_INFO_2  *pJobs;
      int         cJobs,
                  i;
      DWORD       dwPrinterStatus;

      /*
       *  Получаем информацию о состоянии очереди принтера и
       *  заданиях в очереди принтера.
       */

      if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
           return FALSE;

      /*
       *  Если на принтере ошибка, то возвращаем ошибку.
       */

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

      /*
       *  Находим задание в очереди, которое печатается.
       */

      for (i=0; i < cJobs; i++)
      {
          if (pJobs.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.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;

  }



Заранее спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог