информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеСтрашный баг в WindowsГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[Win32] Таймауты можно выставить для COM-портов, а для LPT можно делать CreateFile в Overlapped режиме 20.07.04 12:04  Число просмотров: 1803
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Потом можешь ожидать завершения обычным WaitForSingleObject с любым таймаутом
<programming>
[Win32] Люди помогите с writefile!!! 20.07.04 11:44  
Автор: alex_b Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Добрый День уважаемые программеры...

Возникла необходимость печатать на матричный принтер... До этого юзал API и все было пучком, работал с канвой и все было ОК.. В текущей задаче таких заморочек не надо, нужно тупо открывать текстовый файл и отправлять его на матричный принтер, что я и делал, но вот незадача, нужно проверять готовность принтера, ну там вдруг питание отключили или еще что, и соотвтетственно реагировать... Под Win9x юзал Int 17h... ПОд Nt/XP/2000 такая фишка не катит (оно и понятно), начитавшись MSDN стал юзать CreateFile и WriteFile, и вот тут-то и вылез весь геммор, Создаю файл как LPT1, все нормально.... Но как только вызываю WriteFile прога замирает на этой функции и все.... (Учитывая что питание принтера вырубленно... При включенном питание функция отрабатывает на Ура!), и пока принтер не включишь из этой функции не выходит... Прочитал, что после создания файла нужно выставлять параметры порта (про таймаут и т.п.), но ничего вразумительно не нашел...

Так вот вопрос: Как под все платформы Windows узнать состояние локального матричного принтера
на текущий момент, интересует состояние готовности к печати!
Как сие реализовать, чтоб работало под Win9x/Nt/2000/XP?

Заранее благодарен, за любые ответы! =)
[Win32] Таймауты можно выставить для COM-портов, а для LPT можно делать CreateFile в Overlapped режиме 20.07.04 12:04  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Потом можешь ожидать завершения обычным WaitForSingleObject с любым таймаутом
Хм... 20.07.04 12:13  
Автор: alex_b Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Потом можешь ожидать завершения обычным WaitForSingleObject
> с любым таймаутом
А вызывать WaitForSingleObject как? После чего или в отдельном потоке? Вот гемморой-то! =( Всего-то надо проверить готовность принтера, а писанины дофига!
При создании файла в overlapped режиме [upd] 20.07.04 12:26  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > Потом можешь ожидать завершения обычным
> WaitForSingleObject
> > с любым таймаутом
> А вызывать WaitForSingleObject как? После чего или в
> отдельном потоке? Вот гемморой-то! =( Всего-то надо
> проверить готовность принтера, а писанины дофига!
Ты создаешь структуру OVERLAPPED, одним из полей которой является EVENT, который будет выставлен по завершении асинхронной операции.

Специально для работы с OVERLAPPED файлами есть функция GetOverlappedResult(). Если последним аргументом передать FALSE, то текущее состояние операции будет выдано без ожидания.

Как говорит MSDN:
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Ну а GetLastError в случае висящего Write-а выдаст ERROR_IO_PENDING
-----------------

Вообще то я прогнал. Только что перечитал MSDN, параллельный порт тоже является Communication device, так что можешь использовать простые SetCommMask/WaitCommEvent :-)
Сейчас попробую... 20.07.04 12:55  
Автор: alex_b Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Слушай а при использовании SetCommMask не надо Ovverlaped юзать?
SetCommMask вроде проходит, но при выключенном принтере все равно из WriteFile не выйти.. 20.07.04 13:10  
Автор: alex_b Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Блин как детектить что принтер не отвечает? Ума не приложу, на асме 3 строчки, и проблем нет, но эта NT вонючая нифига делать не дает!!!!
Дык сразу и сказал бы, что нужно только для NT 20.07.04 14:03  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Блин как детектить что принтер не отвечает? Ума не приложу,
> на асме 3 строчки, и проблем нет, но эта NT вонючая нифига
> делать не дает!!!!
И правильно что не дает - иначе наделали б делов. И совсем она не вонючая, кроме того, как кореллируют асм и NT?

Используй DeviceIoControl с кодом IOCTL_PAR_QUERY_INFORMATION.

PARALLEL_BUSY
PARALLEL_NOT_CONNECTED
PARALLEL_OFF_LINE
PARALLEL_PAPER_EMPTY
PARALLEL_POWER_OFF
PARALLEL_SELECTED
Достаточно полная информация?

Вот только сомневаюсь, что 9x вонючая :-) такое поддерживает
SetCommTimeouts поставь 20.07.04 13:24  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
ставил SetCommTimeouts с тайм-аутом=0 нифига не работает... Может кусок кода кинете? 20.07.04 13:40  
Автор: alex_b Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут... 20.07.04 14:39  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут 0 это ты зря ставил - 0 означает что он будт ждать вечно, то есть такое значение по дефолту стоит.

COMMTIMEOUTS cmto,cmt;
GetCommTimeouts(f,&cmto);cmt=cmto;
cmt.WriteTotalTimeoutMultiplier=10;
cmt.WriteTotalTimeoutConstant=100;
SetCommTimeouts(f,&cmt);
Уррааааааа Заработало !!!! Всем big Thanx... 20.07.04 15:57  
Автор: alex_b Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach