Форум: "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