Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Как узнать состояние принтера, а так же заданий на принтереСледующий пример демонстрирует, как использовать функцию EnumJobs для получения структуры JOB_INFO и как использовать функцию GetPrinter для получения структуры PRINTER_INFO: 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)) { return TRUE; } /* * Находим задание в очереди, которое печатается. */ for (i=0; i < cJobs; i++) { if (pJobs[i].Status & JOB_STATUS_PRINTING) { /* * Если задание в состоянии ошибки, * то возвращаем ошибку. */ if (pJobs[i].Status & (JOB_STATUS_ERROR | JOB_STATUS_OFFLINE | JOB_STATUS_PAPEROUT | JOB_STATUS_BLOCKED_DEVQ)) { return TRUE; } } } /* * Ошибок на принтере нет. */ return FALSE; } |
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|