Microsoft KB Archive/154078

= How To Send Raw Data to a Printer Using the Win32 API from Visual Basic =

Article ID: 154078

Article Last Modified on 8/30/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 Q154078



SUMMARY
The Visual Basic Printer object allows for printing through printer drivers, but there may be times when it is desirable to use the Win32 API to send information more directly to the printer. The code sample to follow shows how to achieve this by using API functions that bypass printer drivers to communicate directly with the print spooler.



MORE INFORMATION
 Start a new project in Visual Basic. Form1 is created by default. Place a Command Button on the form.  Add the following code to the Form1 code window:

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

Private Sub Command1_Click Dim lhPrinter As Long Dim lReturn As Long Dim lpcWritten As Long Dim lDoc As Long Dim sWrittenData As String 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) sWrittenData = "How's that for Magic !!!!" & vbFormFeed lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, _            Len(sWrittenData), lpcWritten) lReturn = EndPagePrinter(lhPrinter) lReturn = EndDocPrinter(lhPrinter) lReturn = ClosePrinter(lhPrinter) End Sub



