Моя цель - определить текущий статус принтера. Я нашел following code. Вот слегка измененная версия, чтобы исправить утечки памяти & ошибки:Попытка определить статус принтера всегда возвращает 0 для офлайновых и онлайн-принтеров
#include <Winspool.h>
int GetPrinterStatus(char* szPrnName)
{
HANDLE hHandle = 0; // Handle of the printer
DWORD dwStatus = 0; // Printer status we should receive
DWORD dwSize = 0; // Size of memory we should
// allocate for PRINTER_INFO_2
PRINTER_INFO_2* pPrnInfo2 = 0; // Structure specifies detailed
// printer information
DEVMODE DevMode = {0}; // Structure contains information
// about the device initialization
// and environment of a printer
PRINTER_DEFAULTS PrnDef = { 0, &DevMode, PRINTER_ACCESS_USE };
// Open printer with name szPrnName
if(!OpenPrinter(szPrnName, &hHandle, &PrnDef))
return -1; // Error
// How many memory should be allocated for printer data?
GetPrinter(hHandle, 2, 0, 0, &dwSize);
if(!dwSize)
{
ClosePrinter(hHandle);
return -1; // Error
}
// Allocate memory
pPrnInfo2 = (PRINTER_INFO_2*)malloc(dwSize);
// Receive printer details
if(!GetPrinter(hHandle, 2, (LPBYTE)pPrnInfo2, dwSize, &dwSize))
{
ClosePrinter(hHandle);
free(pPrnInfo2);
return -1; // Error
}
dwStatus = pPrnInfo2->Status;
// Free allocated memory
free(pPrnInfo2);
// Close printer
ClosePrinter(hHandle);
return dwStatus;
}
Так что, когда я запускаю его для этого принтера, то есть offline
:
Как это:
int status = GetPrinterStatus("POS58");
Статус, который я получаю, равен 0
, что точно так же, как когда я называю это для fu Направленный принтер
Я затем попытался заменить OpenPrinter
на звонок с OpenPrinter2W
и использовать опцию PRINTER_OPTION_NO_CACHE
, но это не помогло.
Что я делаю неправильно?
О, ничего себе. Благодарю. Также удивительно, что [документация для PRINTER_INFO_2] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd162845 (v = vs.85) .aspx) не упоминает флаг 'PRINTER_ATTRIBUTE_WORK_OFFLINE' :) Но это работает. Btw, [здесь] (http://stackoverflow.com/a/13005851/843732) другой пример кода для того же самого на SO. – c00000fd
Нет проблем. Другие упоминания о SO на самом деле не покрывают всю сложность. Я только добавил примечание о поведении водителя и зафиксировал пару вещей. –
Спасибо, этот ответ спас меня! Работает как шарм. –