проверьте, подключен ли установленный сетевой принтер к сети

Я хочу проверить, подключен ли принтер к сети. Для этого я получаю дескриптор принтера с помощью OpenPrinter. Затем я хочу использовать PRINTER_STATUS_OFFLINE в PRINTER_INFO_6 с GetPrinter(). Результат всегда 0?

Как получить автономное состояние моего принтера?

Код, который я использовал.

bool IsPrinterOnline(wstring strPrinterFriendlyName)
{
  HANDLE hPrinter ;
  if ( OpenPrinter(const_cast<LPWSTR>(strPrinterFriendlyName.c_str()), &hPrinter, NULL) == 0 )
  {    
    /*OpenPrinter call failed*/
    return false;
  }

  DWORD dwBufsize = 0;
  PRINTER_INFO_6* pinfo = 0;
  GetPrinter(hPrinter, 6,(LPBYTE)pinfo, dwBufsize, &dwBufsize); //Get dwBufsize

  PRINTER_INFO_6* pinfo6 = (PRINTER_INFO_6*)malloc(dwBufsize); //Allocate with dwBufsize
  GetPrinter(hPrinter, 6,(LPBYTE)pinfo6, dwBufsize, &dwBufsize);

  DWORD dwStatus = pinfo6->dwStatus; //always returns 0

  if (dwStatus == PRINTER_STATUS_OFFLINE)
  {
    free(pinfo6); 
    ClosePrinter( hPrinter );
    return false;
  }

  free(pinfo6); 
  ClosePrinter( hPrinter );
  return true;
}

person PTT    schedule 19.10.2012    source источник
comment
Оба GetPrinter действительно успешны?   -  person Jay    schedule 19.10.2012
comment
Второй GetPrinter завершился успешно (вернул ненулевое значение). Но статус всегда нулевой.   -  person PTT    schedule 22.10.2012


Ответы (1)


Я починил это. я использовал «pinfo2-> Атрибуты и PRINTER_ATTRIBUTE_WORK_OFFLINE».

Вот код.

bool IsPrinterOnline(wstring strPrinterFriendlyName)
{
  HANDLE hPrinter ;
  if ( OpenPrinter(const_cast<LPWSTR>(strPrinterFriendlyName.c_str()), &hPrinter, NULL) == 0 )
  {    
    /*OpenPrinter call failed*/
    return false;
  }

  DWORD dwBufsize = 0;
  PRINTER_INFO_2* pinfo = 0;
  int nRet = 0;
  nRet = GetPrinter(hPrinter, 2,(LPBYTE)pinfo, dwBufsize, &dwBufsize); //Get dwBufsize
  DWORD dwGetPrinter = 0;
  if (nRet == 0)
  {
    dwGetPrinter = GetLastError(); 
  }

  PRINTER_INFO_2* pinfo2 = (PRINTER_INFO_2*)malloc(dwBufsize); //Allocate with dwBufsize
  nRet = GetPrinter(hPrinter, 2,reinterpret_cast<LPBYTE>(pinfo2), dwBufsize, &dwBufsize);
  if (nRet == 0)
  {
    dwGetPrinter = GetLastError(); 
    return false;
  }

  if (pinfo2->Attributes & PRINTER_ATTRIBUTE_WORK_OFFLINE )
  {
    free(pinfo2); 
    ClosePrinter( hPrinter );
    return false;
  }

  free(pinfo2); 
  ClosePrinter( hPrinter );
  return true;
}
person PTT    schedule 22.10.2012
comment
@CristianAmarie: не могли бы вы объяснить свой комментарий? - person Thalia; 08.03.2018
comment
Сетевой принтер может быть указан как подключенный к сети, в то время как физическое устройство фактически находится в автономном режиме. Я не говорю, что это всегда верно, но это происходит. Также произошло обратное: сетевой принтер на моем компьютере сообщил, что он не в сети (что было ложным), и я не смог ничего напечатать. Я попросил коллегу что-нибудь напечатать и вуаля — принтер снова обновил свой статус до онлайн. Скорее всего, есть разногласия между спулером и менеджером сетевых списков/UPnP/любым механизмом, который использует Win32. - person Cristian Amarie; 09.03.2018