Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Инженер_3
1 / 1 / 0
Регистрация: 10.06.2016
Сообщений: 66
#1

Определение статуса принтера включён/выключен НЕ РАБОТАЕТ - C++

15.08.2016, 14:26. Просмотров 333. Ответов 0
Метки нет (Все метки)

Есть классический код для определения статуса принтера, в данном случае включён он или выключен.
Начинается работа хорошо, но почему-то поле Status обнулено. В чём здесь загвоздка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
HANDLE h = 0;
PRINTER_INFO_2 *prn = 0;
DWORD pcbNeeded;
int err;
 
//Получаем имя дефолтового(по умолчанию) принтера, драйвер и порт
char *def_string = "no printer";
char buffer[MAX_PATH];
GetProfileString("windows", "device", def_string, buffer, MAX_PATH);
AnsiString Abuffer(buffer);
AnsiString Device, Driver, Port;
 
//Парсим из буфера определённые свойства (принтер, драйвер, порт)
int comma1 = Abuffer.Pos(",");
Device = Abuffer.SubString(1, comma1 - 1);
Abuffer = Abuffer.SubString(comma1 + 1, Abuffer.Length() - comma1);
int comma2 = Abuffer.Pos(",");
Driver = Abuffer.SubString(1, comma2 - 1);
Port = Abuffer.SubString(comma2 + 1, Abuffer.Length() - comma2);
 
if (::OpenPrinter(Device.c_str(), &h, NULL) == 0)
  ShowMessage(L"OpenPrinter Error!");
else
{
  ShowMessage(L"OpenPrinter OK!");
  bool res = ::GetPrinter(h, 2, NULL, 0, &pcbNeeded);
  if (!res && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER))
  {
    prn = (PRINTER_INFO_2*)malloc(pcbNeeded);
    if (::GetPrinter(h, 2, (LPSTR)prn, pcbNeeded, &pcbNeeded) == 0)
    {
      err = ::GetLastError();
      ShowMessage(L"GetPrinter Error!");
    }
    else
    {
      ShowMessage(L"GetPrinter OK!");
 
      // !!! ЗДЕСЬ НАЧИНАЮТСЯ ПРОБЛЕМЫ
      //Тут у нас заполненная структура PRINTER_INFO_2
      if (prn->Status & PRINTER_STATUS_OFFLINE) //Проверяем поле Status на наличие нужного бита
        ShowMessage(L"Printer is offline");
    }
    free(prn);
  }
  else
    ShowMessage(L"Позовите санитаров!");
  ::ClosePrinter(h);
}
Добавлено через 4 часа 42 минуты
Добавлю.
Атрибуты (prn->Attributes) читает великолепно, но статус (prn->Status) почему-то обнулён.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2016, 14:26     Определение статуса принтера включён/выключен НЕ РАБОТАЕТ
Посмотрите здесь:

C++ WinAPI Контекст принтера
как проверить готовность принтера? C++ Builder
C++ Как получить DC принтера?
C++ Builder Присвоение локальной переменной статуса глобальной
C++ Builder Сесть на программно на локальный порт принтера
idhttp страница не найдена handle redirect включён C++ Builder
URLDownloadToFile: Получение статуса загрузки и CallBack Visual C++
Счётчик печати принтера C++ WinAPI
Не работает определение вектора C++
Состояние датчиков USB принтера C++ WinAPI
C++ WinAPI Эмуляция принтера
C++ Builder Проверить включен принтер или выключен

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 05:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru