Microsoft KB Archive/175083

= How To Print Line-by-Line to a Printer =

Article ID: 175083

Article Last Modified on 7/1/2004

-

APPLIES TO


 * Microsoft Visual Basic 5.0 Learning Edition
 * Microsoft Visual Basic 6.0 Learning Edition
 * Microsoft Visual Basic 5.0 Professional Edition
 * Microsoft Visual Basic 6.0 Professional Edition
 * Microsoft Visual Basic 5.0 Enterprise Edition
 * Microsoft Visual Basic 6.0 Enterprise Edition
 * Microsoft Visual Basic 4.0 Standard Edition
 * Microsoft Visual Basic 4.0 Professional Edition
 * Microsoft Visual Basic 4.0 32-Bit Enterprise Edition

-



This article was previously published under Q175083



SUMMARY
Printing page-by-page is the Windows standard; however, it is sometimes desirable to print to a printer line-by-line rather than page-by-page. One advantage to printing line-by-line is that if there is a power failure while printing, the data lost is one log item, at most. The Visual Basic Printer object does not support this mode, but the Win32 API accomplishes this handily.



MORE INFORMATION
This technique will work only when printing to a local line printer, typically a dot matrix printer. Laser and Ink Jet printers are page printers and will not print in single line mode.

 Create a new Visual Basic project and place a CommandButton on Form1.  Add the following code to Form1:

Option Explicit

Private Type DOCINFO pDocName As String pOutputFile As String pDatatype As String End Type

Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal _        hPrinter As Long) As Long Private Declare Function EndDocPrinter Lib "winspool.drv" (ByVal _        hPrinter As Long) As Long Private Declare Function EndPagePrinter Lib "winspool.drv" (ByVal _        hPrinter As Long) As Long Private Declare Function OpenPrinter Lib "winspool.drv" Alias _ "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _         ByVal pDefault As Long) As Long Private Declare Function StartDocPrinter Lib "winspool.drv" Alias _ "StartDocPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _        pDocInfo As DOCINFO) As Long Private Declare Function StartPagePrinter Lib "winspool.drv" (ByVal _        hPrinter As Long) As Long Private Declare Function WritePrinter Lib "winspool.drv" (ByVal _        hPrinter As Long, pBuf As Any, ByVal cdBuf As Long, _         pcWritten As Long) As Long

Dim lhPrinter As Long

Private Sub Command1_Click Dim lReturn As Long Dim lpcWritten As Long Dim sWrittenData As String sWrittenData = "How's that for Magic !!!!" & vbCrLf lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, _               Len(sWrittenData), lpcWritten) End Sub

Private Sub Form_Load Dim lReturn As Long Dim lDoc As Long Dim MyDocInfo As DOCINFO

lReturn = OpenPrinter(Printer.DeviceName, lhPrinter, 0) If lReturn = 0 Then MsgBox "The Printer Name you typed wasn't recognized." Exit Sub End If         MyDocInfo.pDocName = "AAAAAA" MyDocInfo.pOutputFile = vbNullString MyDocInfo.pDatatype = vbNullString lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo) Call StartPagePrinter(lhPrinter) End Sub

Private Sub Form_Unload(Cancel As Integer) Dim lReturn As Long

lReturn = EndPagePrinter(lhPrinter) lReturn = EndDocPrinter(lhPrinter) lReturn = ClosePrinter(lhPrinter) End Sub

 Make the logging printer the default and run the application. Every time you click Command1, a line should be immediately printed to your printer.

WARNING: Pressing the End button on the toolbar or selecting the Run / End menu option will not close the current print job and may block further jobs from printing to that printer. This is because the code to close the print job is in the Form_Unload event. This event is not executed when the sample is closed by the design environment. Always terminate the application by clicking the Close button, using the System menu, or entering Alt-F4.

