2010-07-12 9 views
1

Я пытаюсь получить информацию с принтера при отправке PJL на принтер. Принтер поддерживает PJL, и это USB-принтер. Теперь получение информации/примеров кажется проблемой или я ищу неправильные места. Я знаю, что в MSDN есть много информации, но я пробовал все, что у меня есть, от docinfo, чтобы писать/читать принтеры, и ничего не работает.Delphi: команды PJL для принтера и считывание ответов назад

Некоторые люди говорят, что вы можете использовать writeprinter и readprinter. Я пробовал это, когда я пишущий принтер, принтер, кажется, «что-то» делает, но readprinter возвращает или ошибки или пробелы. Теперь я думаю, что это может быть связано с тем, что драйвер печати «блокирует» порт, поэтому вы не можете читать информацию с него?

Другой вариант, который я видел где-то, - использовать файл writefile и readfile. Здесь вы получите физическую часть порта для принтера, например '\? \ USB # VID_05CA & PID_0403 # S5208603411 # {28d78fad-5a12-11d1-ae5b-0000f803a8c2}'. Затем вы измените порт на «ФАЙЛ». Используйте файл writefile и readfile с указанием пути как физического пути сверху. Получите необходимую информацию, а затем установите порт обратно в исходный порт. Пробовал это также, также получая ошибки.

Я просто пытаюсь сделать простую @PJL INFO PAGECOUNT (я упустил символы выхода и т. Д. И т. Д.). Строка верна, потому что, используя строку на сетевых принтерах, она работает на 100%, и я могу получить информацию. Но локальные принтеры - проблема.

Есть ли у кого-нибудь этот рабочий или рабочий пример? Любая помощь приветствуется.

PS: Ниже приведено 1 из 100 примеров, которые я пробовал. Это пример writeprinter:

procedure TForm1.Button5Click(Sender: TObject); 
Const 
    Defaults: TPrinterDefaults = (
     pDatatype : Nil; 
     pDevMode : nil; 
     DesiredAccess : PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER ) ; 
Var 
    Device : array[0..255] of char; 
    FPrinterHandle:THandle; 
    DocInfo1: TDocInfo1; 
    Buffer, Buffer2:PChar; 
    Written, Len:Cardinal; 
    i: Integer; 
    sPath: String; 
Begin 

    StrCopy(Device,PChar('RICOH Aficio SP 4210N PCL 6')); 
    OpenPrinter(@Device, FPrinterHandle, @Defaults); 

    DocInfo1.pDocName := 'test'; 
    DocInfo1.pOutputFile := Nil; 
    DocInfo1.pDatatype := 'RAW'; 

    StartDocPrinter(FPrinterHandle, 1, @DocInfo1); 

    StartPagePrinter(FPrinterHandle); 

    Buffer := #27+'%[email protected] COMMENT'+#13+#10+'@PJL INFO PAGECOUNT'+#13+#10+#27+'%-12345X'; 

    WritePrinter(FPrinterHandle,@Buffer,Length(Buffer), Written); 

    EndPagePrinter(FPrinterHandle); 

    EndDocPrinter(FPrinterHandle); 

// everithing is OK here, BUT 

    ReadPrinter(FPrinterHandle, @Buffer2, Length(Buffer2), len ); 

end; 
+0

Какая версия Delphi? Мы говорим о unicode или ansi PChar здесь? –

+0

Его Delphi 2007 32bit и его ansi pchar или должны быть. Это всего лишь один пример кода, у меня также много других, где некоторые из них указаны с помощью PAnsiChar. – Paul

ответ

0

Проверить http://www.undocprint.org/winspool/tips_and_tricks для объяснения того, что делать, и какой-то образец C код.

Даже с этим кодом шансы на эту работу для вас минимальны. Чтобы иметь возможность считывать данные с принтера, монитор порта должен поддерживать двунаправленный режим, а стандартный монитор порта USB - нет.

Кроме того, в вашем коде выше Buffer2, переданном ReadPrinter(), неверен. Вам необходимо предварительно выделить буферное пространство, а затем передать адрес буфера, а не адрес указателя на буфер ...

var 
    Buffer2 : array[0..255] of Char; 
begin 
... 
ReadPrinter(FPrinterHandle, @Buffer2[0], Length(Buffer2), len); 
end; 
+0

, если в середине чего-то, что печатает, readprinter вернет что-нибудь, если произойдет ошибка? – GorillaApe