Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:PJL命令发送到打印机并读取响应_Delphi_Command_Printers_Pjl - Fatal编程技术网

Delphi:PJL命令发送到打印机并读取响应

Delphi:PJL命令发送到打印机并读取响应,delphi,command,printers,pjl,Delphi,Command,Printers,Pjl,在将PJL发送到打印机时,我正在努力从打印机获取信息。打印机支持PJL,是一台USB打印机。现在获取信息/示例似乎是个问题,或者我看错了地方。我知道在MSDN上有很多信息,但我已经尝试了我在那里得到的所有东西,从docinfo到写/读打印机,似乎都不起作用 有人说你可以使用writeprinter和readprinter。我试过这样做,当我写打印机时,打印机似乎做了些什么,但readprinter返回或出现错误或空白。现在我想这可能是因为打印驱动程序正在锁定端口,所以您无法从中读取信息 我在某处

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

有人说你可以使用writeprinter和readprinter。我试过这样做,当我写打印机时,打印机似乎做了些什么,但readprinter返回或出现错误或空白。现在我想这可能是因为打印驱动程序正在锁定端口,所以您无法从中读取信息

我在某处看到的另一个选项是使用writefile和readfile。在这里,您可以得到打印机的物理端口部分,例如“\?\USBVID\u 05CA&PID\u 0403s5208064311{28d78fad-5a12-11d1-ae5b-0000f803a8c2}”。然后将端口更改为文件。使用writefile和readfile,路径作为上面的物理路径。获取所需信息,然后将端口设置回原始端口。也尝试了这个,但也出现了错误

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

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

下面是我尝试过的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;
检查如何操作的解释,以及一些示例C代码

即使有了这段代码,对您有效的机会也很小。为了能够从打印机读取数据,端口监视器必须支持双向模式,而标准USB端口监视器则不支持

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

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

什么Delphi版本?我们这里说的是unicode还是ansi PChar?它的Delphi 2007 32位和ansi PChar还是应该是。这只是一个示例代码,我还有很多其他的示例代码,其中一些是用PAnsiChar指定的。如果正在打印的内容中间出现错误,readprinter会返回任何内容吗?