在将PJL发送到打印机时,我很难从打印机获取信息。打印机支持PJL,它是USB打印机。现在获取信息/示例似乎是一个问题,或者我正在寻找错误的地方。我在MSDN上知道有很多信息,但是我已经尝试了所有的东西,从docinfo到写/读打印机,似乎没什么用。
有些人说你可以使用writeprinter和readprinter。我试过这个,当我写打印机时,打印机似乎“做”了什么,但是readprinter返回或错误或空白。现在我想这可能是因为打印驱动程序正在“锁定”端口,所以你无法从中读取信息?
我在某处看到的另一个选项是使用writefile和readfile。在这里,您将获得打印机的物理端口部件,例如'\?\ USB#VID_05CA& PID_0403#S5208603411#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}'。然后将端口更改为“FILE”。使用writefile和readfile,路径作为上面的物理路径。获取所需信息,然后将端口设置回原始端口。试过这个,也有错误。
我只是想做一个简单的@PJL INFO PAGECOUNT(我遗漏了逃脱字符等等)。字符串是正确的,因为在网络打印机上使用字符串,它100%工作,我可以获取信息。但是本地打印机是个问题。
有没有人有这个工作或工作的例子?任何帮助将不胜感激。
PS:以下是我尝试过的100个例子中的1个。这是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;
答案 0 :(得分:0)
检查http://www.undocprint.org/winspool/tips_and_tricks以获取有关操作的说明以及一些示例C代码。
即使使用此代码,这项工作的可能性也很小。为了能够从打印机读回,端口监视器必须支持双向模式,而标准USB端口监视器则不支持。
另外,在上面的代码中,传递给ReadPrinter()的Buffer2不正确。你需要预先分配缓冲区空间,然后传递缓冲区的地址,而不是指向缓冲区的指针的地址......
var
Buffer2 : array[0..255] of Char;
begin
...
ReadPrinter( FPrinterHandle, @Buffer2[0], Length(Buffer2), len );
end;