Microsoft KB Archive/96795

= How To Use PASSTHROUGH Escape to Send Data Directly to Printer =

Article ID: 96795

Article Last Modified on 7/13/2004

-

APPLIES TO


 * Microsoft Visual Basic 2.0 Standard Edition
 * Microsoft Visual Basic 3.0 Professional Edition
 * Microsoft Visual Basic 2.0 Professional Edition
 * Microsoft Visual Basic 3.0 Professional Edition
 * Microsoft Visual Basic 1.0 Standard Edition

-



This article was previously published under Q96795



SUMMARY
By using the Windows API Escape function, your application can pass data directly to the printer. If the printer driver supports the PASSTHROUGH printer escape, you can use the Escape function and the PASSTHROUGH printer escape to send native printer language codes to the printer driver.

Printer escapes such as PASSTHROUGH allow applications to access certain facilities of output devices that are not directly available through the graphics device interface (GDI). The PASSTHROUGH printer escape allows the application to send data directly to the printer, bypassing the standard print-driver code.



MORE INFORMATION
A printer driver that supports the PASSTHROUGH printer escape does not add native printer language codes to the data stream sent to the printer, so you can send data directly to the printer. However, Microsoft recommends that applications not perform functions that consume printer memory, such as downloading a font or a macro.

The sample program listed below sends native PCL codes to the printer to change the page orientation and the paper bin. A Hewlett-Packard LaserJet is the assumed default printer.

NOTE: This is not a recommended solution. For a better solution for 32-bit, please see the following article in the Microsoft Knowledge Base:

138594 : How To Send Raw Data to a Printer by Using the Win32 API

An Important Note
The Windows API Escape function is provided in Windows versions 3.0 and 3.1 for backward compatibility with earlier versions of Microsoft Windows. Applications are supposed to use the GDI DeviceCapabilities and ExtDeviceMode functions instead of the Escape function, but neither DeviceCapabilities nor ExtDeviceMode can be called directly from Visual Basic. This is because they are exported by the printer driver, not by the Windows GDI. The only way to use ExtDeviceMode or DeviceCapabilities in Visual Basic is to create a DLL and call them from there.

There have been reports of problems using the PASSTHROUGH escape with the driver HPPCL5A.DRV. This is the version of the printer driver for the HP LaserJet III series that shipped with Windows 3.1. A more recent version of the driver (HPPCL5MS.DRV), which has no known problems with the PASSTHROUGH escape, is available in the Windows Driver Library (WDL). To obtain the latest driver for the HP LaserJet III series, download the self-extracting file HPPCL5.EXE from the WDL.

Steps to Create Example
 Start Visual Basic or from the File menu, choose New Project (ALT, F, N) if Visual Basic is already running. Form1 is created by default.  Add the following code to the general declarations section of Form1:

' Enter the entire Declare statement on one, single line.

Private Declare Function Escape Lib &quot;Gdi&quot; (ByVal Hdc%, ByVal nEscape%,     ByVal ncount%, ByVal indata$, ByVal oudata as Any) As Integer

Const PASSTHROUGH = 19

Const RevLandScape = &quot;&l3O&quot; ' PCL command to change Paper ' orientation to Reverse Landscape. Const Portrait = &quot;&l0O&quot;    ' PCL command to change paper ' orientation to Portrait. Const ManualFeed = &quot;&l3H&quot;  ' PCL command to change Paper Bin ' to Manual Feed Envelope. Const AutoFeed = &quot;&l1H&quot;    ' PCL command to change Paper Bin ' to Paper Tray AutoFeed

 Add a list box (List1) to Form1.  Add the following code to Form1's Form_Load event procedure:

Sub Form_Load List1.AddItem &quot;HP/PCL Reverse Landscape&quot; List1.AddItem &quot;HP/PCL Portrait&quot; List1.AddItem &quot;HP/PCL Manual Feed Envelope&quot; List1.AddItem &quot;HP/PCL Paper Tray Auto Feed&quot; End Sub

  Add the following code to the List1_Click event procedure:

Sub List1_Click Select Case List1.ListIndex Case 0: PCL_Escape$ = Chr$(27) + RevLandScape Case 1: PCL_Escape$ = Chr$(27) + Portrait Case 2: PCL_Escape$ = Chr$(27) + ManualFeed Case 3: PCL_Escape$ = Chr$(27) + AutoFeed End Select

' Enter the following two lines as one, single line: PCL_Escape$ = Chr$(Len(PCL_Escape$) MOD 256) + Chr$(Len(PCL_Escape$) \ 256) + PCL_Escape$

Printer.Print &quot;&quot; Result% = Escape%(Printer.hDC, PASSTHROUGH, 0, PCL_Escape$, 0&)

Select Case Result% ' Enter each Case statement on one, single line. Case Is < 0: MsgBox &quot;The PASSTHROUGH Escape is not supported by this printer driver.&quot;, 48 Case 0: MsgBox &quot;An error occurred sending the escape sequence.&quot;, 48 Case Is > 0: MsgBox &quot;Escape Successfully sent. Sending test printout to printer.&quot; Printer.Print &quot;Test case of &quot;; List1.Text Printer.EndDoc End Select End Sub

 From the Run menu, choose Start (ALT, R, S) to run the program. List1 is filled with four escape sequences to send to the printer. Select any of the options in the list box. A message box appears to indicate the success of the operation.</li></ol>

If the printer driver does not support the PASSTHROUGH printer escape, you must use the DeviceCapabilities and ExtDevMode functions instead.

Additional query words: kbVBp100 kbVBp200 kbVBp300

Keywords: kbhowto kbprint KB96795

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.