Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проверка готовности принтера LPT


supervk ©   (2005-07-21 12:55:00) 

Подскажите, пожалйста, как под windows NT программно проверить готовность принтера, подключённого к LPT1/LPT2?


tesseract   (2005-07-27 20:44:00) [1]

to Supervk >>> Винда реально буферизует запись

Прочитая про отложенную связь(OVERLAPPED).  

 FileHandle:=CreateFile('LPT1',GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL or FILE_ATTRIBUTE_OVERLLAPED, 0);

Не забудь сохдать сааму структуру TOVERLAPPED.

Пример для COM поищи здесь я много здесь кода  приводил


DC-AC   (2005-07-27 08:32:00) [2]

10: Почитай здесь : http://www.lvr.com/parport.htm


Масяня   (2005-07-26 11:29:00) [3]

2 supervk
Код и так был не мой :)


supervk   (2005-07-26 11:23:00) [4]

У нас на 98-х стоит такая проверка:

function PrinterOnLine: boolean;
var b: byte;
begin
     asm
       mov ah, 02h
       mov dx, 0
       int 17h
       mov , ah
     end;
     Result:= (b=144) or (b=16) or (b=176);
end;


и нормально работает на всех видах принтеров. Но с XP и 2000-ми начались проблемы. А прикрутить это в NT мне не удалось.


DC-AC   (2005-07-26 10:01:00) [5]

Боюсь без обращения к порту LPT через драйвер I/O не обойтись. Нужно отслеживать состояние линий PAPER и ERROR. Но вот все ли принтеры корректно выставляют эти линии - сомневаюсь, большинство современных лазерных и струйных принтеров (и даже новые матричники !) работает  по пакетным протоколам передачи данных, и в обратном направлении просто посылается байт/строка статуса.
Так что с _универсальным_ решением этой задачи могут быть проблемы.


supervk   (2005-07-26 05:56:00) [6]

2 Масяня ©

Достаточно странный пример (с ошибками). Он вообще не претендовал на попытку записать в LPT порт. Пишет сразу в принтер, и, видимо, подобное обращение идёт через винду и проходит нормально независимо от того включён ли принтер, есть ли в нём бумага и т.п. А дальше уже самма винда берёт на себя доставку документа до принтера - сообщает, что нет бумаги или принтера.

Мне же нужно проверить наличие бумаги и подключение принтера самому - вместо винды.


supervk   (2005-07-26 05:38:00) [7]

Т.е. таким образом проверить готовность не удаётся. Видимо винда буферизирует подобные обращения.


supervk   (2005-07-26 05:36:00) [8]

2 tesseract ©
Попробовал сделать, как вы предложили. Написал функцию тестовой записи в порт:


var
 i: integer;
 FileHandle: THandle;
 a : byte;
 Timeouts: COMMTIMEOUTS;
begin
 FileHandle:=CreateFile('LPT1',GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 With Timeouts do
 begin
   ReadIntervalTimeout:=100;
   ReadTotalTimeoutMultiplier:=1;
   ReadTotalTimeoutConstant:=100;
   WriteTotalTimeoutMultiplier:=1;
   WriteTotalTimeoutConstant:=100;
 end;
 SetCommTimeouts(FileHandle, Timeouts);
 if( not WriteFile(FileHandle, a, 1, DWORD(i), nil) ) then
   ShowMessage('Не смог записать');
 if i<>1 then
   ShowMessage('Число записанных байт не соответствует должному');
   else ShowMessage('записалось столько сколько должно было');
end;


Функция проходит корректно (т.е. i=1), даже если выключен принтер, а через некоторое время windows начинает выдавать сообщения, что документ так и не смогла записать в принтер.


Масяня   (2005-07-25 14:25:00) [9]

К описанному выше коду
Таким образом запускалась тестовая печать


Масяня   (2005-07-25 14:24:00) [10]

У меня была подобная прога для подобного принтера. Сейчас расскажу как я делал. На форму бросил компонент TMemo и кнопку. При нажатии кнопки выполнялся следующий код:

procedure TForm1.Button1Click (Sender: TObject);
var
PrnHandle: THandle;
DocInfol: TDocInfol;
i: integer;
begin
if not OpenPrinter ('Lexmark Z35' , PrnHandle, nil) then begin
ShowMessage('Произошла ошибка'+ IntToStr (GetLastError));
exit;
end;
DocInFol.pDocName:=PChar ('test.doc);
DocInFol.pOutputFile:=nil;
DocInFol.pDataType:='RAW'
StartDocPrinter(PrnHandle, 1 @DocInFol);
StartPagePrinter(PrnHandle);
for i:=0 to Memo.Lines.Count -1 do
WritePrinter (PrnHandle, PChar (Memo1.Lines.Strings[i]),
Length (Memo1.Lines.Strings[i], N);
EndPagePrinter(PrnHandle);
EndDocPrinter(PrnHandle);
ClosePRinter(PrnHandle);
end;


supervk   (2005-07-25 10:43:00) [11]

2 simpson ©:

если речь идёт о PRINTER_INFO_2.Status то он всегда возвращается = 0. И не у меня одного.


tesseract   (2005-07-24 19:48:00) [12]

Пошли туда данные и проверь реально ли WriteFile их записал - нормальный девайс их обязан считать из буфера записи.


simpson   (2005-07-21 15:01:00) [13]

Например, с помоющью GetPrinter.


Наверх

Титульная страница Поиск, карта сайта Написать письмо