Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Вниз

проверка готовности принтера 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
2-1123605234
Nox777
2005-08-09 20:33
2005.09.18
Как вычислить арккосинус числа?


6-1117029648
Delphi_is_cool
2005-05-25 18:00
2005.09.18
TTcpClient режим bmNonBlocking.


4-1120929115
Olejek
2005-07-09 21:11
2005.09.18
Включение-отключение сетевого адаптера


4-1122371321
Slavyan
2005-07-26 13:48
2005.09.18
переключение шрифта


14-1124811657
Windows
2005-08-23 19:40
2005.09.18
Следить за процессом закачки файла по GUAGE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский