[Win32] Таймауты можно выставить для COM-портов, а для LPT можно делать CreateFile в Overlapped режиме20.07.04 12:04 Число просмотров: 1803 Автор: amirul <Serge> Статус: The Elderman
Возникла необходимость печатать на матричный принтер... До этого юзал 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 > с любым таймаутом А вызывать 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?
Используй DeviceIoControl с кодом IOCTL_PAR_QUERY_INFORMATION.
PARALLEL_BUSY
PARALLEL_NOT_CONNECTED
PARALLEL_OFF_LINE
PARALLEL_PAPER_EMPTY
PARALLEL_POWER_OFF
PARALLEL_SELECTED
Достаточно полная информация?
Вот только сомневаюсь, что 9x вонючая :-) такое поддерживает
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут 0 это ты зря ставил - 0 означает что он будт ждать вечно, то есть такое значение по дефолту стоит.