Some Windows printer drivers and some Windows-oriented languages will not allow the PCL escape character pass-through to the printer since it is not a printable character in the Windows font set. (Visual Basic and the HP LaserJet III printer driver from the Windows for Workgroups disks are examples) The HP LaserJet III printer driver from the Windows 3.1 disks and the HP LaserJet 4 printer drivers do not have this problem unless used with a language like Visual Basic which causes the escape character to be removed on any printer driver. The Windows API contains a function specifically designed to avoid this problem by allowing the programmer to send any codes through the printer driver and the language that is sending data to the printer driver without interference. This API function is defined as follows:
short Escape(hdc,PASSTHROUGH, NULL, lpInData, NULL)
The PASSTHROUGH printer escape allows the application to send data directly to the printer, bypassing the standard print-driver code.
Note: To use this escape, an application must have complete information about how the particular printer operates.
ParameterDescription
PASSTHROUGH This function ID has a constant value of 19.
hdcHDC Identifies the device context.
lpInDataLPSTR Points to a structure whose first word (16 bits) contains the number of bytes of input data. The remaining bytes of the structure contain the data itself.
Returns
The return value specifies the number of bytes transferred to the printer if the escape is successful. This value is less than or equal to zero if the escape is not successful or not implemented.
Errors
If the function fails, the return value is one of the following:
ValueMeaning
SP_ERRORGeneral error.
SP_OUTOFDISKNot enough disk space is currently available for spooling, and no more space will become available.
SP_OUTOFMEMORYNot enough memory is available for spooling.
SP_USERABORTUser terminated the job through Print Manager.
Comments
There may be restrictions on the kinds of device data an application can send to the device without interfering with the operation of the driver. In general, applications must avoid resetting the printer or causing the page to be printed.
It is strongly recommended that applications do not perform actions that consume printer memory, such as downloading a font or a macro.
An application can avoid corrupting its data stream when issuing multiple, consecutive PASSTHROUGH escapes by not accessing the printer any other way during the sequence.
An application can guarantee that the PASSTHROUGH escape will be successful if it uses a "save" PostScript operator before sending PASSTHROUGH data and a "restore" operator after. Avoiding graphics device interface (GDI) functions between calls to the PASSTHROUGH escape and avoiding commands that cause a page to eject are other means to ensure that the escape will be successful.
The following is a sample Visual Basic program illustrating the use of this technique:
Option Explicit Const PASSTHROUGH = 19 Const PCLmacro = "&f" Const PCLOverlay = "y4X" Declare Function Escape Lib "gdi" (ByVal hdc As Integer, ByVal Esc As Integer, ByVal ncount As Integer, ByVal InData As String, ByVal outdata As Any) As Integer Sub Form_Load () list1.AddItem ("Form 100") list1.AddItem ("Form 101") End Sub Sub List1_Click () Dim PCL_Escape As String Dim Result As Integer Select Case list1.ListIndex Case 0 PCL_Escape = Chr(27) & PCLMacro & "100" & PCLOverlay Case 1 PCL_Escape = Chr(27) & PCLMacro & "101" & PCLOverlay End Select PCL_Escape = Chr(Len(PCL_Escape) Mod 265) & Chr(Len(PCL_Escape) \ 265) & PCL_Escape printer.Print "" Result = Escape(printer.hdc, PASSTHROUGH, 0, PCL_Escape, 0&) Select Case Result Case Is < 0 MsgBox "The PassThrough Escape is not supported by this printer driver.", 0 + 48 + 0 Case 0 MsgBox "An error occured sending the Escape Sequence.", 0 + 48 + 0 Case Is > 0 MsgBox "Escape successfully sent. Sending test printout to the printer.", 0 + 48 + 0 printer.Print "Test case of "; list1.text printer.EndDoc End Select End Sub
Comments: