Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

проверка готовности принтера LPT   Найти похожие ветки 

 
supervk ©   (2005-07-21 12:55) [0]

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


 
simpson ©   (2005-07-21 15:01) [1]

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


 
tesseract ©   (2005-07-24 19:48) [2]

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


 
supervk ©   (2005-07-25 10:43) [3]

2 simpson ©:

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


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

У меня была подобная прога для подобного принтера. Сейчас расскажу как я делал. На форму бросил компонент 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;


 
Масяня ©   (2005-07-25 14:25) [5]

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


 
supervk ©   (2005-07-26 05:36) [6]

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 начинает выдавать сообщения, что документ так и не смогла записать в принтер.


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

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


 
supervk ©   (2005-07-26 05:56) [8]

2 Масяня ©

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

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


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

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


 
supervk ©   (2005-07-26 11:23) [10]

У нас на 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 мне не удалось.


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

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


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

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


 
tesseract ©   (2005-07-27 20:44) [13]

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 поищи здесь я много здесь кода  приводил



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
8-1114532632
vic_774N
2005-04-26 20:23
2005.09.18
алгоритм сравнения двух изображений ...


14-1125032470
boalse
2005-08-26 09:01
2005.09.18
Астрология


2-1123673314
Xmen
2005-08-10 15:28
2005.09.18
QuickReport


14-1125036868
Phoniex
2005-08-26 10:14
2005.09.18
Дата-кабель для Сименс А62


14-1124633367
vrem
2005-08-21 18:09
2005.09.18
Что почитать?