Mastodon
Programmierung

Print direct to Port (without driver)

> Hi,
>
> I have a Serial Printer conected to COM1 but I don’t have the NT driver
> for it (it is an EPSON TM-U295), I need to print from my delphi 4
> application with a series of ESC commands, how can I do this.

You can either work dirrectly with the comm port functions,
or install any print driver (TTY/Generic recommended) and
use the following code:

The following unit “PrtRaw.pas” demonstrates a 16/32 bit
raw printing unit for Delphi and Borland C Builder.

Following the unit, is an exmaple on using the
PrtRaw unit.

Notes:

1) You are responsible for embedding all necessary
control codes that the printer may require (including
form feed codes).

2) You must specify a valid printer and port name.

[code lang=”delphi”]unit PrtRaw;

{Copyright (c) 1998 by Joe C. Hecht – All rights Reserved}
{


joehecht@gte.net

You may use and share this unit}
{providing my name and the copyright notice stays intact.}

interface

uses
WinTypes;

{$IFDEF WIN32}
type SpoolInt = DWORD;
{$ELSE}
type SpoolInt = integer;
{$ENDIF}

function StartRawPrintJob(PrinterName : pChar;
Port : pChar;
DocName : pChar) : THandle;

function StartRawPrintPage(hPrn : THandle) : integer;

function PrintRawData(hPrn : THandle;
Buffer : pointer;
NumBytes : SpoolInt) : integer;

function EndRawPrintPage(hPrn : THandle) : integer;

function EndRawPrintJob(hPrn : THandle) : integer;

implementation
uses
WinProcs,
{$IFDEF WIN32}
WinSpool;
{$ELSE}
Print;
{$ENDIF}

function StartRawPrintJob(PrinterName : pChar;
Port : pChar;
DocName : pChar) : THandle;
{$IFDEF WIN32}
var
hPrn : THandle;
DocInfo1 : TDocInfo1;
{$ENDIF}
begin
{$IFDEF WIN32}
if (OpenPrinter(PChar(PrinterName),
hPrn,
nil) = FALSE) then begin
Result := THandle(-1);
Exit;
end;
DocInfo1.pDocName := DocName;
DocInfo1.pOutputFile := Port;
DocInfo1.pDataType := ‘RAW’;
if (StartDocPrinter(hPrn,
1,
@DocInfo1) = 0) then begin
Result := THandle(-1);
exit;
end;
Result := hPrn;
{$ELSE}
result := OpenJob(Port,
DocName,
0);
{$ENDIF}
end;

function StartRawPrintPage(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (StartPagePrinter(hPrn) = FALSE) then begin
Result := -1;
exit;
end;
result := 1;
{$ELSE}
result := StartSpoolPage(hPrn);
{$ENDIF}
end;

function PrintRawData(hPrn : THandle;
Buffer : pointer;
NumBytes : SpoolInt) : integer;
{$IFDEF WIN32}
var
BytesWritten : DWORD;
{$ENDIF}
begin
if (NumBytes = 0) then begin
Result := 1;
exit;
end;
{$IFDEF WIN32}
if (WritePrinter(hPrn,
Buffer,
NumBytes,
BytesWritten) = FALSE) then begin
Result := -1;
exit;
end;
if (NumBytes <> BytesWritten) then begin
Result := -1;
exit;
end;
Result := 1;
{$ELSE}
result := WriteSpool(hPrn,
Buffer,
NumBytes);
{$ENDIF}
end;

function EndRawPrintPage(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (EndPagePrinter(hPrn) = FALSE) then begin
Result := -1;
exit;
end;
Result := 1;
{$ELSE}
result := EndSpoolPage(hPrn);
{$ENDIF}
end;

function EndRawPrintJob(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (EndDocPrinter(hPrn) = FALSE) then begin
Result := -1;
exit;
end;
if (ClosePrinter(hPrn) = FALSE) then begin
Result := -1;
exit;
end;
Result := 1;
{$ELSE}
result := CloseJob(hPrn);
{$ENDIF}
end;

end.
[/code]

Example of use:

[code lang=”delphi”]uses
PrtRaw;

procedure TForm1.Button1Click(Sender: TObject);
var
hPrn : THandle;
Data : array[0..31] of char;
begin

hPrn := StartRawPrintJob(‘Generic / Text Only’,
‘LPT1:’,
‘My Document’);
if (integer(hPrn) < 0) then begin ShowMessage('StartRawPrintJob Failed'); exit; end; if (StartRawPrintPage(hPrn) < 0) then begin ShowMessage('StartRawPrintPage Failed'); EndRawPrintJob(hPrn); exit; end; Data[0] := 'P'; Data[1] := 'a'; Data[2] := 'g'; Data[3] := 'e'; Data[4] := #32; Data[5] := '1'; Data[6] := #13; Data[7] := #10; if (PrintRawData(hPrn, @data, < 0) then begin ShowMessage('PrintRawData Failed'); EndRawPrintPage(hPrn); EndRawPrintJob(hPrn); exit; end; if (EndRawPrintPage(hPrn) < 0) then begin ShowMessage('EndRawPrintPage Failed'); EndRawPrintJob(hPrn); exit; end; if (StartRawPrintPage(hPrn) < 0) then begin ShowMessage('StartRawPrintPage Failed'); EndRawPrintJob(hPrn); exit; end; Data[0] := 'P'; Data[1] := 'a'; Data[2] := 'g'; Data[3] := 'e'; Data[4] := #32; Data[5] := '2'; Data[6] := #13; Data[7] := #10; if (PrintRawData(hPrn, @data, < 0) then begin ShowMessage('PrintRawData Failed'); EndRawPrintPage(hPrn); EndRawPrintJob(hPrn); exit; end; if (EndRawPrintPage(hPrn) < 0) then begin ShowMessage('EndRawPrintPage Failed'); EndRawPrintJob(hPrn); exit; end; if (EndRawPrintJob(hPrn) < 0) then begin ShowMessage('EndRawPrintJob Failed'); exit; end; end; end. [/code] Joe -- Joe C. Hecht http://home1.gte.net/joehecht/index.htm [tags]Delphi, Ports, Printing[/tags]

0 Kommentare zu “Print direct to Port (without driver)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.