2010-07-12 7 views
1

PJL을 프린터로 보낼 때 프린터에서 정보를 가져 오는 중 어려움을 겪습니다. 프린터는 PJL을 지원하며 USB 프린터입니다. 이제 정보/예제를 얻는 것이 문제가되거나 잘못된 장소를보고 있습니다. 나는 MSDN에 많은 정보가 있음을 알고 있지만 docinfo에서부터 프린터를 쓰거나 읽는 것까지 아무 것도 시도하지 않았으며 아무 것도 작동하지 않는 것으로 보인다.Delphi : PJL이 프린터에 명령을 보내고 응답을 다시 읽습니다.

일부 사람들은 writeprinter 및 readprinter를 사용할 수 있다고 말합니다. 나는 프린터를 쓸 때 프린터가 뭔가를하는 것처럼 보이지만, readprinter가 반환하거나 오류가 있거나 공백이있는 경우 이것을 시도했습니다. 이제 프린터 드라이버가 포트를 "잠그고"있기 때문에 정보를 다시 읽을 수 없기 때문에 이것이 가능하다고 생각하십니까?

내가 본 다른 옵션은 writefile과 readfile을 사용하는 것입니다. 여기서는 프린터의 실제 포트 부분을 가져옵니다 (예 : '\? \ USB # VID_05CA & PID_0403 # S5208603411 # {28d78fad-5a12-11d1-ae5b-0000f803a8c2}'). 그런 다음 포트를 "FILE"로 변경합니다. writefile과 readfile을 경로를 위의 실제 경로로 사용하십시오. 필요한 정보를 얻은 다음 포트를 다시 원래 포트로 설정하십시오. 이 또한 오류를 얻으려고 시도했다.

나는 단순한 @PJL INFO PAGECOUNT (이스케이프 문자 등을 생략했습니다.)를 시도하고 있습니다. 네트워크 프린터에서 문자열을 사용하면 100 % 작동하며 정보를 얻을 수 있기 때문에 문자열이 정확합니다. 그러나 로컬 프린터가 문제입니다.

이 작동하는 또는 작동하는 예제가있는 사람이 있습니까? 어떤 도움이라도 대단히 감사 할 것입니다.

추신 : 아래의 예는 제가 시도한 100 가지 예 중 하나입니다. 무엇을해야하는지에 대한 설명, 일부 샘플 C 코드에 대한

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+'%[email protected] 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

어떤 Delphi 버전입니까? 여기에 유니 코드 또는 ansi PChar를 말하고 있습니까? –

+0

델파이 2007 32 비트와 그 ansi pchar이어야합니다. 이것은 하나의 예제 코드 일 뿐이며, PAnsiChar로 지정되는 코드도 많이 있습니다. – Paul

답변

0

확인 http://www.undocprint.org/winspool/tips_and_tricks :이 writeprinter의 예입니다.

이 코드를 사용하더라도이 작업의 가능성은 거의 없습니다. 프린터에서 다시 읽을 수 있으려면 포트 모니터가 양방향 모드를 지원해야하며 표준 USB 포트 모니터는 양방향 모드를 지원해야합니다.

위의 코드에서 ReadPrinter()로 전달 된 Buffer2가 올바르지 않습니다. 버퍼 공간을 미리 할당 한 다음 버퍼의 주소가 아닌 버퍼의 주소를 전달해야합니다. ...

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

인쇄중인 내용의 중간에 오류가 발생하면 readprinter가 아무 것도 반환하지 않습니까? – GorillaApe