Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Состояние LPT принтера, Опрос принтера 
:(
    Опции темы
SeregaLBN
Дата 13.7.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Надо узнать состояние LPT принтера
Пытался сначала работать со структурой PRINTER_INFO_2 + ф-ция GetPrinter, и смотреть поле PRINTER_INFO_2::Status, но тут всё время возвращается неопределённое состояние 0 (вызов GetPrinter выполняется успешно). Искал в гугле - у всех таже проблема, а ответа нет.

Сейчас пытаюсь открывать LPT принтер, и узнавать его сотояние с помощью ф-ции DeviceIoControl. Но здесь тоже траблы.
Делаю так:
Код

#include <WinIOCtl.h>

#define PARALLEL_AUTOFEED        0x02
#define PARALLEL_PAPER_EMPTY     0x04
#define PARALLEL_OFF_LINE        0x08
#define PARALLEL_POWER_OFF       0x10
#define PARALLEL_NOT_CONNECTED   0x20
#define PARALLEL_BUSY            0x40
#define PARALLEL_SELECTED        0x80

#define IOCTL_PAR_QUERY_INFORMATION CTL_CODE(FILE_DEVICE_PARALLEL_PORT, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)

BOOL PrinterStatus(OUT CString &strStatus) {
   strStatus.Empty();

   BOOL bRes = FALSE;
   // пробую напрямую читать из LPT порта
   HANDLE hLpt = ::CreateFile(_T("LPT1"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
   if (hLpt == INVALID_HANDLE_VALUE)
   {
      DWORD dwErrCode1 = ::GetLastError();
   } else {
      PAR_QUERY_INFORMATION ParInfo;
      DWORD dwRes = 0;
      bRes = ::DeviceIoControl(hLpt, IOCTL_PAR_QUERY_INFORMATION, NULL, 0, &ParInfo, sizeof(ParInfo), &dwRes, NULL);
      if (!bRes) {
         DWORD dwErrCode2 = ::GetLastError();
      } else {
         if (ParInfo.Status & PARALLEL_INIT         ) { bRes &= TRUE ; strStatus += _T(" | PARALLEL_INIT"         ); }
         if (ParInfo.Status & PARALLEL_AUTOFEED     ) { bRes &= TRUE ; strStatus += _T(" | PARALLEL_AUTOFEED"     ); }
         if (ParInfo.Status & PARALLEL_PAPER_EMPTY  ) { bRes &= FALSE; strStatus += _T(" | PARALLEL_PAPER_EMPTY"  ); }
         if (ParInfo.Status & PARALLEL_OFF_LINE     ) { bRes &= TRUE ; strStatus += _T(" | PARALLEL_OFF_LINE"     ); }
         if (ParInfo.Status & PARALLEL_POWER_OFF    ) { bRes &= FALSE; strStatus += _T(" | PARALLEL_POWER_OFF"    ); }
         if (ParInfo.Status & PARALLEL_NOT_CONNECTED) { bRes &= FALSE; strStatus += _T(" | PARALLEL_NOT_CONNECTED"); }
         if (ParInfo.Status & PARALLEL_BUSY         ) { bRes &= FALSE; strStatus += _T(" | PARALLEL_BUSY"         ); }
         if (ParInfo.Status & PARALLEL_SELECTED     ) { bRes &= TRUE ; strStatus += _T(" | PARALLEL_SELECTED"     ); }
   
         if (!strStatus.IsEmpty()) strStatus = strStatus.Mid(3);
      }
      ::CloseHandle(hLpt); hLpt = NULL;
   }

   return bRes;
}


Этот код опроса LPT порта на 2х машинах с WinXP Profi + SP2 без принтера и на машине с Win2K Profi + SP4 с USB принтером отработался успешно - возвращается FALSE со строкой strStatus == "PARALLEL_POWER_OFF | PARALLEL_BUSY | PARALLEL_SELECTED".
А на машине с Win2K Profi + SP4 c LPT принтером и на др. машине с Win2K Server + SP4 без принтера не работает - ф-ция DeviceIoControl ругается - GetLastError возвращает ERROR_INVALID_FUNCTION.

Может кто-то подскажет в чём проблема?
PM MAIL   Вверх
SeregaLBN
Дата 20.7.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Ну чтож, проблему пока не решил. Но расказать хочу о следующем.

Т.к. описания в SDK по ф-ции DeviceIoControl мне показалось маловато, а о IOCTL_PAR_QUERY_INFORMATION там вообще упоминаний нет, то решил выкачать DDK (на раскладках в Киеве ненашёл).
Залез на microsoft.com, думал выкачаю. Ненашёл smile. Но предлагают за 10$ на CD.
Ну, думаю, позвоню в представительство Microsoft в Украине. Позвонил шеф, ему ответили - незнаем такого продукта. Обьяснили им что это за продукт, что на головном сайте он есть, что даже продают его за 10$. Отвечают - узнаем и перезвоним. Перезвонили, говорят а какой его идентификационный номер продажи. Отвечаем - х.з. нет на головном сайте номера. Ну, тогда говорят, нет такого продукта у Microsoft...
Вот такие пироги, вот такие менеджеры в Киеве в Microsoft'e. Нет слов - одни ... выражения!

Может кто-то знает где выкачать этот грёбаный DDK?
PM MAIL   Вверх
Crait
Дата 20.7.2005, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 20.2.2003

Репутация: нет
Всего: 1



Ха, повеселил ты меня однако smile
Вот что нашлось у меня на компе по твоему вопросу :

http://club.shelek.com/viewfiles.php?id=2 - DDK 2000

http://msdn.microsoft.com/library/default...._intro_44iv.asp

http://www.microsoft.com - Windows DDK поискать. Кажется, 200$.

www.club.shelek.com
Раздел "Файлы", пункт DDK

http://shelek.org.ru/ddk/98ddk.exe
http://shelek.org.ru/ddk/2kddknly.exe
http://shelek.org.ru/ddk/DDK_XP.ISO
ftp://ftp.usm.ru/pub/developers/NT40.DDK/Nt40DDK.zip
ftp://ftp.europe.f-secure.com/pub/misc/win-util/ddk2000.zip

Удачи smile
PM MAIL   Вверх
SeregaLBN
Дата 21.7.2005, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Спасибо, уже качаю:
http://shelek.tmf.ru/archive/ddk/2kddknly.exe
http://shelek.tmf.ru/archive/ddk/ddk_xp.rar

Это сообщение отредактировал(а) SeregaLBN - 21.7.2005, 09:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.