Как узнать состояние принтера, а так же заданий на принтере
Следующий пример демонстрирует, как использовать функцию 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
Оставить комментарий
Комментарии
1.
19 мая 2005, 12:22:15
у меня чё то не работает
dwPrinterStatus - всегда равен 0
еси у кого нибудь всё работает или не работает сообщите здесь или
напишите мне на PopkoDV@belhard.com, или ICQ > 228206103
dwPrinterStatus - всегда равен 0
еси у кого нибудь всё работает или не работает сообщите здесь или
напишите мне на PopkoDV@belhard.com, или ICQ > 228206103