首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi:对打印机执行PJL命令并读回响应

Delphi:对打印机执行PJL命令并读回响应
EN

Stack Overflow用户
提问于 2010-07-12 15:39:04
回答 1查看 4.1K关注 0票数 1

在向打印机发送PJL时,我正在努力从打印机取回信息。打印机支持PJL,并且是USB打印机。现在,获取信息/示例似乎是一个问题,或者我找错了地方。我知道在MSDN上有很多信息,但我已经尝试了那里的所有方法,从docinfo到读/写打印机,似乎都不起作用。

有些人说你可以使用writeprinter和readprinter。我已经尝试过了,当我写打印机时,打印机似乎“做”了一些事情,但读打印机返回或错误或空白。现在我认为这可能是因为打印驱动程序正在“锁定”端口,所以你不能从它读取信息?

我在某处看到的另一个选择是使用writefile和readfile。在这里,您将获得打印机的物理端口部分,例如'\?\USB#VID_05CA&PID_0403#S5208603411#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}'.然后将端口更改为"FILE“。使用writefile和readfile,并将路径作为上面的物理路径。获取所需的信息,然后将端口设置回原始端口。我也试过了,也遇到了错误。

我只是想做一个简单的@PJL INFO PAGECOUNT (我省略了转义字符等)。该字符串是正确的,因为在网络打印机上使用该字符串,它是100%有效的,并且我可以获得信息。但是本地打印机是个问题。

有没有人有这方面的工作或工作的例子?任何帮助都将不胜感激。

PS:下面是我试过的100个例子中的一个。这是一个写入式打印机示例:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2011-03-07 11:53:37

请查看http://www.undocprint.org/winspool/tips_and_tricks,了解如何执行此操作的解释,以及一些示例C代码。

即使使用此代码,为您工作的机会也很小。为了能够从打印机回读,端口监视器必须支持双向模式,而标准USB端口监视器不支持。

此外,在上面的代码中,传递给ReadPrinter()的Buffer2是不正确的。您需要预先分配缓冲区空间,然后传递缓冲区的地址,而不是指向缓冲区的指针地址……

代码语言:javascript
复制
var
    Buffer2 : array[0..255] of Char;
begin
...
ReadPrinter( FPrinterHandle, @Buffer2[0], Length(Buffer2), len );
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3226623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档