WritePrinter 向打印机输出数据

OpenPrinter, WritePrinter,直接写打印机端口,只要知道打印机采用的语言就可以。
WritePrinter   向打印机输出数据
例:
uses   CommDlg;

{$IFNDEF   WIN32}
  const   MAX_PATH   =   144;
{$ENDIF}

procedure   TForm1.Button1Click(Sender:   TObject);
var
    Pd   :   TPrintDlg;
    DocInfo:   TDocInfo;
begin
    FillChar(Pd,   sizeof(Pd),   #0);  
    Pd.lStructSize   :=   sizeof(Pd);
    Pd.hWndOwner   :=   Form1.Handle;
    Pd.Flags   :=   PD_RETURNDC;
    if   PrintDlg(pd)   then   begin
        FillChar(DocInfo,   sizeof(DocInfo),   #0);
        DocInfo.cbSize   :=   SizeOf(DocInfo);
        GetMem(DocInfo.lpszDocName,   32);
        GetMem(DocInfo.lpszOutput,   MAX_PATH);
        lStrCpy(DocInfo.lpszDocName,   'My   Document ');
      {Add   this   line   to   print   to   a   file   }
        lStrCpy(DocInfo.lpszOutput,   'C:/Download/Test.doc ');
        StartDoc(Pd.hDc,   DocInfo);
        StartPage(Pd.hDc);
        TextOut(Pd.hDc,   100,   100,   'Page   1 ',   6);
        EndPage(Pd.hDc);
        StartPage(Pd.hDc);
        TextOut(Pd.hDc,   100,   100,   'Page   2 ',   6);
        EndPage(Pd.hDc);
        EndDoc(Pd.hDc);
        FreeMem(DocInfo.lpszDocName,   32);
        FreeMem(DocInfo.lpszOutput,   MAX_PATH);
    end;
end;
//
uses   winspool;

procedure   PrintFile(const   sFileName:   string);
const
    BufSize   =   16384;
type
    TDoc_Info_1   =   record
        pDocName:   pChar;
        pOutputFile:   pChar;
        pDataType:   pChar;
    end;
var
    Count,   BytesWritten:   integer;
    hPrinter:   THandle;
    Device   :   array[0..255]   of   char;
    Driver   :   array[0..255]   of   char;
    Port       :   array[0..255]   of   char;
    hDeviceMode:   THandle;
    DocInfo:   TDoc_Info_1;
    f:   file;
    Buffer:   Pointer;
begin
    Printer.PrinterIndex   :=   -1;
    Printer.GetPrinter(Device,   Driver,   Port,   hDeviceMode);
    if   not   WinSpool.OpenPrinter(@Device,   hPrinter,   nil)   then   exit;
    DocInfo.pDocName   :=   'MyDocument ';
    DocInfo.pOutputFile   :=   nil;
    DocInfo.pDatatype   :=   'RAW ';
    if   StartDocPrinter(hPrinter,   1,   @DocInfo)   =   0   then
    begin
        WinSpool.ClosePrinter(hPrinter);
        exit;
    end;
    if   not   StartPagePrinter(hPrinter)   then
    begin
        EndDocPrinter(hPrinter);
        WinSpool.ClosePrinter(hPrinter);
        exit;
    end;
    System.Assign(f,   sFileName);
    try
        Reset(f,   1);
        GetMem(Buffer,   BufSize);
        while   not   eof(f)   do
        begin
            Blockread(f,   Buffer^,   BufSize,   Count);
            if   Count   >   0   then
            begin
                if   not   WritePrinter(hPrinter,   Buffer,   Count,   BytesWritten)   then
                begin
                    EndPagePrinter(hPrinter);
                    EndDocPrinter(hPrinter);
                    WinSpool.ClosePrinter(hPrinter);
                    FreeMem(Buffer,   BufSize);
                    exit;
                end;
            end;
        end;
        FreeMem(Buffer,   BufSize);
        EndDocPrinter(hPrinter);
        WinSpool.ClosePrinter(hPrinter);
    finally
        System.Closefile(   f   );
    end;
end;

*************************************
  procedure   WriteRawStringToPrinter(PrinterName:   String;   S:   String);
  var
      Handle:   THandle;
      N:   DWORD;
      DocInfo1:   TDocInfo1;
  begin
  if   not   OpenPrinter(PChar(PrinterName),   Handle,   nil)   then
      begin
      ShowMessage( 'error   '   +   IntToStr(GetLastError));
      Exit;
      end;
  with   DocInfo   do
      begin
      pDocName   :=   PChar( 'test   doc ');
      pOutputFile   :=   nil;
      pDataType   :=   'RAW ';
      end;
  StartDocPrinter(Handle,   1,   ocInfo);
  StartPagePrinter(Handle);
  WritePrinter(Handle,   PChar(S),   Length(S),   N);
  EndPagePrinter(Handle);
  EndDocPrinter(Handle);
  ClosePrinter(Handle);
  end;

The   PrinterName   parameter   must   be   the   name   of   the   printer   as   it   is
installed.   For   example,   if   the   name   of   the   printer
is   "HP   LaserJet   5MP "   then   that   is   what   you   should   pass.
</quote>
/

Use   CreateFile   to   get   a   handle   to   LPT1

    LPTHandle   :=   CreateFile(   'LPT1 ',GENERIC_WRITE,
                                  0,   PSecurityAttributes(nil),
                                  OPEN_EXISTING,   FILE_FLAG_OVERLAPPED,
                                  0);


Then   use   WriteFile   to   send   a   string   of   characters   or   use

    While   not
        TransmitCommChar(   LPTHandle,   CharToSend   )   do
            Application.ProcessMessages;

It   sends   one   raw   character   at   a   time   to   the   parallel   port.   It   waits   for   the   recent   character   to   get   processed   and   then   immediately   sends   a   new   one.   I   got   it   printing   stuff
pretty   fast.

 

 

#4楼 得分:0回复于:2003-02-14 14:42:45
The   WritePrinter   function   informs   the   print   spooler   that   data   should   be   written   to   the   specified   printer.  

BOOL   WritePrinter(

        HANDLE   hPrinter, //   handle   to   printer   object  
        LPVOID   pBuf, //   pointer   to   array   that   contains   printer   data  
        DWORD   cbBuf, //   size,   in   bytes,   of   array  
        LPDWORD   pcWritten   //   addr.   of   variable   with   count   of   bytes   written  
      );
 

Parameters

hPrinter

Identifies   the   printer.  

pBuf

Points   to   an   array   of   bytes   that   contains   the   data   that   should   be   written   to   the   printer.  

cbBuf

Specifies   the   size,   in   bytes,   of   the   array.  

pcWritten

Points   to   a   value   that   specifies   the   number   of   bytes   of   data   that   were   written   to   the   printer.  

 

Return   Values

If   the   function   succeeds,   the   return   value   is   nonzero.
If   the   function   fails,   the   return   value   is   zero.   To   get   extended   error   information,   call   GetLastError

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值