PJL をプリンターに送信するときに、プリンターから情報を取得するのに苦労しています。プリンターはPJL対応のUSBプリンターです。情報/例の取得に問題があるか、間違った場所を見ているようです。MSDN には多くの情報があることは知っていますが、docinfo からプリンターの書き込み/読み取りまで、そこにあるすべてのものを試してみましたが、何も機能していないようです。
writeprinter と readprinter を使用できると言う人もいます。私はこれを試してみました.writeprinterすると、プリンターは何かを「実行」しているように見えますが、readprinterはエラーまたは空白を返します. これは、プリンタードライバーがポートを「ロック」しているためであると考えられるため、ポートから情報を読み取ることができませんか?
どこかで見た他のオプションは、writefile と readfile を使用することです。ここで、プリンターの物理ポート部分を取得します。次に、ポートを「FILE」に変更します。上記の物理パスとしてのパスで writefile と readfile を使用します。必要な情報を取得してから、ポートを元のポートに戻します。これも試してみましたが、エラーも発生しました。
シンプルな@PJL INFO PAGECOUNTを実行しようとしています(エスケープ文字などを省略しました)。ネットワークに接続されたプリンターで文字列を使用すると、100%機能し、情報を取得できるため、文字列は正しいです。しかし、ローカル プリンターには問題があります。
この作業または作業例を持っている人はいますか? どんな助けでも大歓迎です。
PS: 以下は、私が試した数百の例の 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;