{"id":203,"date":"2007-05-12T17:00:32","date_gmt":"2007-05-12T15:00:32","guid":{"rendered":" http:\/\/www.nsonic.de\/blog\/2007\/05\/print-direct-to-port-without-driver\/"},"modified":"2007-05-12T17:00:34","modified_gmt":"2007-05-12T15:00:34","slug":"print-direct-to-port-without-driver","status":"publish","type":"post","link":"https:\/\/www.nsonic.de\/blog\/2007\/05\/print-direct-to-port-without-driver\/","title":{"rendered":"Print direct to Port (without driver)"},"content":{"rendered":"<p><em>> Hi,<br \/>\n><br \/>\n> I have a Serial Printer conected to COM1 but I don&#8217;t have the NT driver<br \/>\n> for it (it is an EPSON TM-U295), I need to print from my delphi 4<br \/>\n> application with a series of ESC commands, how can I do this.<br \/>\n<\/em><\/p>\n<p>You can either work dirrectly with the comm port functions,<br \/>\nor install any print driver (TTY\/Generic recommended) and<br \/>\nuse the following code:<br \/>\n<!--more--><br \/>\nThe following unit &#8220;PrtRaw.pas&#8221; demonstrates a 16\/32 bit<br \/>\nraw printing unit for Delphi and Borland C Builder.<\/p>\n<p>Following the unit, is an exmaple on using the<br \/>\nPrtRaw unit.<\/p>\n<p>Notes:<\/p>\n<p>1) You are responsible for embedding all necessary<br \/>\ncontrol codes that the printer may require (including<br \/>\nform feed codes).<\/p>\n<p>2) You must specify a valid printer and port name.<\/p>\n<p>[code lang=&#8221;delphi&#8221;]unit PrtRaw;<\/p>\n<p>{Copyright (c) 1998 by Joe C. Hecht &#8211; All rights Reserved}<br \/>\n{<\/p>\n<p><!-- \nvar prefix = '&#109;a' + 'i&#108;' + '&#116;o'; \nvar path = 'hr' + 'ef' + '='; \nvar addy57397 = 'j&#111;&#101;h&#101;cht' + '&#64;' + 'gt&#101;' + '&#46;' + 'n&#101;t'; \ndocument.write( '<a ' + path + '\\'' + prefix + ':' + addy57397 + '\\'>' ); \ndocument.write( addy57397 ); \ndocument.write( '<\\\/a>' ); \n\/\/--><br \/>\njoehecht@gte.net <\/p>\n<p> You may use and share this unit}<br \/>\n{providing my name and the copyright notice stays intact.}<\/p>\n<p>interface<\/p>\n<p>uses<br \/>\n  WinTypes;<\/p>\n<p>{$IFDEF WIN32}<br \/>\n type SpoolInt = DWORD;<br \/>\n{$ELSE}<br \/>\n type SpoolInt = integer;<br \/>\n{$ENDIF}<\/p>\n<p>function StartRawPrintJob(PrinterName : pChar;<br \/>\n                          Port : pChar;<br \/>\n                          DocName : pChar) : THandle;<\/p>\n<p>function StartRawPrintPage(hPrn : THandle) : integer;<\/p>\n<p>function PrintRawData(hPrn : THandle;<br \/>\n                      Buffer : pointer;<br \/>\n                      NumBytes : SpoolInt) : integer;<\/p>\n<p>function EndRawPrintPage(hPrn : THandle) : integer;<\/p>\n<p>function EndRawPrintJob(hPrn : THandle) : integer;<\/p>\n<p>implementation<br \/>\n uses<br \/>\n   WinProcs,<br \/>\n{$IFDEF WIN32}<br \/>\n WinSpool;<br \/>\n{$ELSE}<br \/>\n Print;<br \/>\n{$ENDIF}<\/p>\n<p>function StartRawPrintJob(PrinterName : pChar;<br \/>\n                          Port : pChar;<br \/>\n                          DocName : pChar) : THandle;<br \/>\n{$IFDEF WIN32}<br \/>\n var<br \/>\n   hPrn : THandle;<br \/>\n   DocInfo1 : TDocInfo1;<br \/>\n{$ENDIF}<br \/>\nbegin<br \/>\n {$IFDEF WIN32}<br \/>\n   if (OpenPrinter(PChar(PrinterName),<br \/>\n                   hPrn,<br \/>\n                   nil) = FALSE)  then begin<br \/>\n     Result := THandle(-1);<br \/>\n     Exit;<br \/>\n   end;<br \/>\n   DocInfo1.pDocName := DocName;<br \/>\n   DocInfo1.pOutputFile := Port;<br \/>\n   DocInfo1.pDataType := &#8216;RAW&#8217;;<br \/>\n   if (StartDocPrinter(hPrn,<br \/>\n                       1,<br \/>\n                       @DocInfo1) = 0) then begin<br \/>\n     Result := THandle(-1);<br \/>\n     exit;<br \/>\n   end;<br \/>\n   Result := hPrn;<br \/>\n {$ELSE}<br \/>\n  result := OpenJob(Port,<br \/>\n                    DocName,<br \/>\n                    0);<br \/>\n {$ENDIF}<br \/>\nend;<\/p>\n<p>function StartRawPrintPage(hPrn : THandle) : integer;<br \/>\nbegin<br \/>\n {$IFDEF WIN32}<br \/>\n   if (StartPagePrinter(hPrn) = FALSE) then begin<br \/>\n     Result := -1;<br \/>\n     exit;<br \/>\n   end;<br \/>\n   result := 1;<br \/>\n {$ELSE}<br \/>\n  result := StartSpoolPage(hPrn);<br \/>\n {$ENDIF}<br \/>\nend;<\/p>\n<p>function PrintRawData(hPrn : THandle;<br \/>\n                      Buffer : pointer;<br \/>\n                      NumBytes : SpoolInt) : integer;<br \/>\n{$IFDEF WIN32}<br \/>\nvar<br \/>\n  BytesWritten : DWORD;<br \/>\n {$ENDIF}<br \/>\nbegin<br \/>\n  if (NumBytes = 0) then begin<br \/>\n    Result := 1;<br \/>\n    exit;<br \/>\n  end;<br \/>\n {$IFDEF WIN32}<br \/>\n   if (WritePrinter(hPrn,<br \/>\n                    Buffer,<br \/>\n                    NumBytes,<br \/>\n                    BytesWritten) = FALSE) then begin<br \/>\n     Result := -1;<br \/>\n     exit;<br \/>\n   end;<br \/>\n   if (NumBytes <> BytesWritten) then begin<br \/>\n     Result := -1;<br \/>\n     exit;<br \/>\n   end;<br \/>\n   Result := 1;<br \/>\n {$ELSE}<br \/>\n  result := WriteSpool(hPrn,<br \/>\n                       Buffer,<br \/>\n                       NumBytes);<br \/>\n {$ENDIF}<br \/>\nend;<\/p>\n<p>function EndRawPrintPage(hPrn : THandle) : integer;<br \/>\nbegin<br \/>\n {$IFDEF WIN32}<br \/>\n   if (EndPagePrinter(hPrn) = FALSE) then begin<br \/>\n     Result := -1;<br \/>\n     exit;<br \/>\n   end;<br \/>\n   Result := 1;<br \/>\n {$ELSE}<br \/>\n  result := EndSpoolPage(hPrn);<br \/>\n {$ENDIF}<br \/>\nend;<\/p>\n<p>function EndRawPrintJob(hPrn : THandle) : integer;<br \/>\nbegin<br \/>\n {$IFDEF WIN32}<br \/>\n   if (EndDocPrinter(hPrn) = FALSE) then begin<br \/>\n     Result := -1;<br \/>\n     exit;<br \/>\n   end;<br \/>\n   if (ClosePrinter(hPrn) = FALSE) then begin<br \/>\n     Result := -1;<br \/>\n     exit;<br \/>\n   end;<br \/>\n   Result := 1;<br \/>\n {$ELSE}<br \/>\n  result := CloseJob(hPrn);<br \/>\n {$ENDIF}<br \/>\nend;<\/p>\n<p>end.<br \/>\n[\/code]<\/p>\n<p><b>Example of use:<br \/>\n<\/b><\/p>\n<p>[code lang=&#8221;delphi&#8221;]uses<br \/>\n  PrtRaw;<\/p>\n<p>procedure TForm1.Button1Click(Sender: TObject);<br \/>\nvar<br \/>\n  hPrn : THandle;<br \/>\n  Data : array[0..31] of char;<br \/>\nbegin<\/p>\n<p>  hPrn := StartRawPrintJob(&#8216;Generic \/ Text Only&#8217;,<br \/>\n                           &#8216;LPT1:&#8217;,<br \/>\n                           &#8216;My Document&#8217;);<br \/>\n  if (integer(hPrn) < 0) then begin\n    ShowMessage('StartRawPrintJob Failed');\n    exit;\n  end;\n\n  if (StartRawPrintPage(hPrn) < 0) then begin\n    ShowMessage('StartRawPrintPage Failed');\n    EndRawPrintJob(hPrn);\n    exit;\n  end;\n\n  Data[0] := 'P';\n  Data[1] := 'a';\n  Data[2] := 'g';\n  Data[3] := 'e';\n  Data[4] := #32;\n  Data[5] := '1';\n  Data[6] := #13;\n  Data[7] := #10;\n\n  if (PrintRawData(hPrn,\n                   @data,\n                    < 0) then begin\n    ShowMessage('PrintRawData Failed');\n    EndRawPrintPage(hPrn);\n    EndRawPrintJob(hPrn);\n    exit;\n  end;\n\n  if (EndRawPrintPage(hPrn) < 0) then begin\n    ShowMessage('EndRawPrintPage Failed');\n    EndRawPrintJob(hPrn);\n    exit;\n  end;\n\n  if (StartRawPrintPage(hPrn) < 0) then begin\n    ShowMessage('StartRawPrintPage Failed');\n    EndRawPrintJob(hPrn);\n    exit;\n  end;\n  Data[0] := 'P';\n  Data[1] := 'a';\n  Data[2] := 'g';\n  Data[3] := 'e';\n  Data[4] := #32;\n  Data[5] := '2';\n  Data[6] := #13;\n  Data[7] := #10;\n\n  if (PrintRawData(hPrn,\n                   @data,\n                    < 0) then begin\n    ShowMessage('PrintRawData Failed');\n    EndRawPrintPage(hPrn);\n    EndRawPrintJob(hPrn);\n    exit;\n  end;\n\n  if (EndRawPrintPage(hPrn) < 0) then begin\n    ShowMessage('EndRawPrintPage Failed');\n    EndRawPrintJob(hPrn);\n    exit;\n  end;\n\n  if (EndRawPrintJob(hPrn) < 0) then begin\n    ShowMessage('EndRawPrintJob Failed');\n    exit;\n  end;\n\nend;\n\nend.\n[\/code]\nJoe\n-- \nJoe C. Hecht\nhttp:\/\/home1.gte.net\/joehecht\/index.htm\n\n[tags]Delphi, Ports, Printing[\/tags]\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>> Hi, > > I have a Serial Printer conected to COM1 but I don&#8217;t have the NT driver > for it (it&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[11],"tags":[75,118,119],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p71Tml-3h","_links":{"self":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts\/203"}],"collection":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/comments?post=203"}],"version-history":[{"count":0,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/posts\/203\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/media?parent=203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/categories?post=203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nsonic.de\/blog\/wp-json\/wp\/v2\/tags?post=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}