Delphi: команды PJL для принтера и чтение ответов обратно - PullRequest
1 голос
/ 12 июля 2010

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

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

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

Я просто пытаюсь сделать простой @PJL INFO PAGECOUNT (я пропустил escape-символы и т. Д., И т. Д.). Строка верна, потому что, используя строку на сетевых принтерах, она работает на 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+'%-12345X@PJL 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;

1 Ответ

0 голосов
/ 07 марта 2011

Проверьте 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;
...