информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут... 20.07.04 14:39  Число просмотров: 1635
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Нашел у ся такой кусок кода (для сом порта юзался). Таймаут 0 это ты зря ставил - 0 означает что он будт ждать вечно, то есть такое значение по дефолту стоит.

COMMTIMEOUTS cmto,cmt;
GetCommTimeouts(f,&cmto);cmt=cmto;
cmt.WriteTotalTimeoutMultiplier=10;
cmt.WriteTotalTimeoutConstant=100;
SetCommTimeouts(f,&cmt);
<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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach