PDA

View Full Version : Windows spool printing without a driver.



Greg Sergeant
8-Mar-2005, 05:17 PM
Here are a couple of methods I have used to print when I wanted to use
the spooler but didn't want the print driver interfering. Using this
method you can send escape sequences and such without having the driver
strip them out or freak out on them.


External_Function APIOpenPrinter "OpenPrinterA" winspool.drv ;
String pPrinterName ;
Integer phPrn ;
String pDefault ;
Returns Integer

External_Function APIStartDocPrinter "StartDocPrinterA" winspool.drv ;
Integer hPrn ;
Integer level ;
String pDocInfo ;
Returns Integer

External_Function APIStartPagePrinter "StartPagePrinter" winspool.drv ;
Integer hPrn ;
Returns Integer

External_Function APIWritePrinter "WritePrinter" winspool.drv ;
Handle hPrn ;
String pBuf ;
Integer cdBuf ;
Address aWritten ;
Returns Integer

External_Function APIEndPagePrinter "EndPagePrinter" winspool.drv ;
Integer hPrn ;
Returns Integer

External_Function APIEndDocPrinter "EndDocPrinter" winspool.drv ;
Integer hPrn ;
Returns Integer

External_Function APIClosePrinter "ClosePrinter" winspool.drv ;
Integer hPrn ;
Returns Integer


/// Prints a file to the specified printer through the windows print spooler
/// but bypasses the windows drivers
/// Returns an integer indicating success or failure
/// example of use
/// Get SpoolFile "c:\temp\test.txt", "HP DeskJet 850C Series" to iRetVal
Function SpoolFile global String sFile String sPrnName Returns Integer
Address aiWritten ahPrn
Handle hPrn
String sBuffer sDocInfo sJobName
Integer iWritten iRetVal
ZeroType DOC_INFO_1 To sDocInfo

Move 0 To iWritten
Move (AddressOf(iWritten)) To aiWritten
Move 0 To hPrn
Move (AddressOf(hPrn)) To ahPrn
/// Fill the DOC_INFO_1 structure.
Move ("Customer Service" + gsNull) To sJobName
Put (AddressOf(sJobName)) To sDocInfo At DOC_INFO_1.pDocName

/// Open printer For Output To obtain Handle.
/// Set it up To Begin receiving raw data.
Move (APIOpenPrinter(sPrnName, ahPrn, (Character(0)))) To iRetVal
If (Not(iRetVal)) Begin
Send stop_box "Unable to open printer spooler." "Internal Error"
Function_Return 1
End
Move (APIStartDocPrinter(hPrn, 1, sDocInfo)) To iRetVal
If (Not(iRetVal)) Begin
Move (APIClosePrinter(hPrn)) To iRetVal
Send stop_box "Unable to start document printer." "Internal Error"
Function_Return 1
End
Move (APIStartPagePrinter(hPrn)) To iRetVal
If (Not(iRetVal)) Begin
Move (APIEndDocPrinter(hPrn)) To iRetVal
Send stop_box "Unable to start page printer." "Internal Error"
Function_Return 1
End

/// Open the file and pump it to the printer.
Direct_Input sFile
While (Not(Seqeof))
Read_Block sBuffer 2047
Move (APIWritePrinter(hPrn, sBuffer, (Length(sBuffer)),
aiWritten)) To iRetVal
If (Not(iRetVal)) Begin
Move (APIEndPagePrinter(hPrn)) To iRetVal
Move (APIEndDocPrinter(hPrn)) To iRetVal
Move (APIClosePrinter(hPrn)) To iRetVal
Close_Input
Send stop_box "Unable to write to printer spooler."
"Internal Error"
Function_Return 1
End
Loop
Close_Input

/// Shut down spooling process.
Move (APIEndPagePrinter(hPrn)) To iRetVal
Move (APIEndDocPrinter(hPrn)) To iRetVal
Move (APIClosePrinter(hPrn)) To iRetVal
Function_Return 0
End_Function

/// Prints a string to the specified printer through the windows print
spooler
/// but bypasses the windows drivers
/// Returns an integer indicating success or failure
/// example of use
/// Get SpoolString "Testing 123", "HP DeskJet 850C Series" to iRetVal
Function SpoolString global String sData String sPrnName Returns Integer
Address aiWritten ahPrn
Handle hPrn
Integer iWritten iRetVal
String sDocInfo sJobName
ZeroType DOC_INFO_1 To sDocInfo

Move 0 To iWritten
Move (AddressOf(iWritten)) To aiWritten
Move 0 To hPrn
Move (AddressOf(hPrn)) To ahPrn
/// Fill the DOC_INFO_1 structure.
Move ("Customer Service" + gsNull) To sJobName
Put (AddressOf(sJobName)) To sDocInfo At DOC_INFO_1.pDocName

/// Open printer For Output To obtain Handle.
/// Set it up To Begin recieving raw data.
Move (APIOpenPrinter(sPrnName, ahPrn, (Character(0)))) To iRetVal
If (Not(iRetVal)) Begin
Send stop_box "Unable to open printer spooler." "Internal Error"
Function_Return 1
End
Move (APIStartDocPrinter(hPrn, 1, sDocInfo)) To iRetVal
If (Not(iRetVal)) Begin
Move (APIClosePrinter(hPrn)) To iRetVal
Send stop_box "Unable to start document printer." "Internal Error"
Function_Return 1
End
Move (APIStartPagePrinter(hPrn)) To iRetVal
If (Not(iRetVal)) Begin
Move (APIEndDocPrinter(hPrn)) To iRetVal
Send stop_box "Unable to start page printer." "Internal Error"
Function_Return 1
End

/// Output the string to the printer.
Move (APIWritePrinter(hPrn, sData, (Length(sData)), aiWritten)) To
iRetVal
If (Not(iRetVal)) Begin
Move (APIEndPagePrinter(hPrn)) To iRetVal
Move (APIEndDocPrinter(hPrn)) To iRetVal
Move (APIClosePrinter(hPrn)) To iRetVal
Close_Input
Send stop_box "Unable to write to printer spooler." "Internal
Error"
Function_Return 1
End

/// Shut down spooling process.
Move (APIEndPagePrinter(hPrn)) To iRetVal
Move (APIEndDocPrinter(hPrn)) To iRetVal
Move (APIClosePrinter(hPrn)) To iRetVal
Function_Return 0
End_Function

Nicholas Herlick
24-Aug-2005, 05:25 PM
Greg,

Question about the program logic. I pasted your code into a file named
despool.pkg and used it in a test program. Got the compiler errors shown
below. Can you point me in the right direction? Thanks! - Nick Herlick

ERROR: 54 Invalid symbol in expression DOC_INFO_1_SIZE ON LINE: 58 (37888)
OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 61 (37890) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 63 (37892) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression GSNULL ON LINE: 65 (37893) OF FILE:
C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 66 (37894) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression DOC_INFO_1.PDOCNAME ON LINE: 66
(37894) OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression DOC_INFO_1_SIZE ON LINE: 122 (37936)
OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 125 (37938) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 127 (37940) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression GSNULL ON LINE: 129 (37941) OF FILE:
C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 130 (37942) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression DOC_INFO_1.PDOCNAME ON LINE: 130
(37942) OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression DOC_INFO_1_SIZE ON LINE: 58 (37888)
OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 61 (37890) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 63 (37892) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression GSNULL ON LINE: 65 (37893) OF FILE:
C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 66 (37894) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression DOC_INFO_1.PDOCNAME ON LINE: 66
(37894) OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression DOC_INFO_1_SIZE ON LINE: 122 (37936)
OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 125 (37938) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 127 (37940) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression GSNULL ON LINE: 129 (37941) OF FILE:
C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 130 (37942) OF
FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
ERROR: 54 Invalid symbol in expression DOC_INFO_1.PDOCNAME ON LINE: 130
(37942) OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG



"Greg Sergeant" <gsergeant@specialservicesystems.com> wrote in message
news:Et4FoxCJFHA.1952@dacmail.dataaccess.com...
> Here are a couple of methods I have used to print when I wanted to use
> the spooler but didn't want the print driver interfering. Using this
> method you can send escape sequences and such without having the driver
> strip them out or freak out on them.
>
>
> External_Function APIOpenPrinter "OpenPrinterA" winspool.drv ;
> String pPrinterName ;
> Integer phPrn ;
> String pDefault ;
> Returns Integer
>
> External_Function APIStartDocPrinter "StartDocPrinterA" winspool.drv ;
> Integer hPrn ;
> Integer level ;
> String pDocInfo ;
> Returns Integer
>
> External_Function APIStartPagePrinter "StartPagePrinter" winspool.drv ;
> Integer hPrn ;
> Returns Integer
>
> External_Function APIWritePrinter "WritePrinter" winspool.drv ;
> Handle hPrn ;
> String pBuf ;
> Integer cdBuf ;
> Address aWritten ;
> Returns Integer
>
> External_Function APIEndPagePrinter "EndPagePrinter" winspool.drv ;
> Integer hPrn ;
> Returns Integer
>
> External_Function APIEndDocPrinter "EndDocPrinter" winspool.drv ;
> Integer hPrn ;
> Returns Integer
>
> External_Function APIClosePrinter "ClosePrinter" winspool.drv ;
> Integer hPrn ;
> Returns Integer
>
>
> /// Prints a file to the specified printer through the windows print
spooler
> /// but bypasses the windows drivers
> /// Returns an integer indicating success or failure
> /// example of use
> /// Get SpoolFile "c:\temp\test.txt", "HP DeskJet 850C Series" to iRetVal
> Function SpoolFile global String sFile String sPrnName Returns Integer
> Address aiWritten ahPrn
> Handle hPrn
> String sBuffer sDocInfo sJobName
> Integer iWritten iRetVal
> ZeroType DOC_INFO_1 To sDocInfo
>
> Move 0 To iWritten
> Move (AddressOf(iWritten)) To aiWritten
> Move 0 To hPrn
> Move (AddressOf(hPrn)) To ahPrn
> /// Fill the DOC_INFO_1 structure.
> Move ("Customer Service" + gsNull) To sJobName
> Put (AddressOf(sJobName)) To sDocInfo At DOC_INFO_1.pDocName
>
> /// Open printer For Output To obtain Handle.
> /// Set it up To Begin receiving raw data.
> Move (APIOpenPrinter(sPrnName, ahPrn, (Character(0)))) To iRetVal
> If (Not(iRetVal)) Begin
> Send stop_box "Unable to open printer spooler." "Internal Error"
> Function_Return 1
> End
> Move (APIStartDocPrinter(hPrn, 1, sDocInfo)) To iRetVal
> If (Not(iRetVal)) Begin
> Move (APIClosePrinter(hPrn)) To iRetVal
> Send stop_box "Unable to start document printer." "Internal
Error"
> Function_Return 1
> End
> Move (APIStartPagePrinter(hPrn)) To iRetVal
> If (Not(iRetVal)) Begin
> Move (APIEndDocPrinter(hPrn)) To iRetVal
> Send stop_box "Unable to start page printer." "Internal Error"
> Function_Return 1
> End
>
> /// Open the file and pump it to the printer.
> Direct_Input sFile
> While (Not(Seqeof))
> Read_Block sBuffer 2047
> Move (APIWritePrinter(hPrn, sBuffer, (Length(sBuffer)),
> aiWritten)) To iRetVal
> If (Not(iRetVal)) Begin
> Move (APIEndPagePrinter(hPrn)) To iRetVal
> Move (APIEndDocPrinter(hPrn)) To iRetVal
> Move (APIClosePrinter(hPrn)) To iRetVal
> Close_Input
> Send stop_box "Unable to write to printer spooler."
> "Internal Error"
> Function_Return 1
> End
> Loop
> Close_Input
>
> /// Shut down spooling process.
> Move (APIEndPagePrinter(hPrn)) To iRetVal
> Move (APIEndDocPrinter(hPrn)) To iRetVal
> Move (APIClosePrinter(hPrn)) To iRetVal
> Function_Return 0
> End_Function
>
> /// Prints a string to the specified printer through the windows print
> spooler
> /// but bypasses the windows drivers
> /// Returns an integer indicating success or failure
> /// example of use
> /// Get SpoolString "Testing 123", "HP DeskJet 850C Series" to iRetVal
> Function SpoolString global String sData String sPrnName Returns Integer
> Address aiWritten ahPrn
> Handle hPrn
> Integer iWritten iRetVal
> String sDocInfo sJobName
> ZeroType DOC_INFO_1 To sDocInfo
>
> Move 0 To iWritten
> Move (AddressOf(iWritten)) To aiWritten
> Move 0 To hPrn
> Move (AddressOf(hPrn)) To ahPrn
> /// Fill the DOC_INFO_1 structure.
> Move ("Customer Service" + gsNull) To sJobName
> Put (AddressOf(sJobName)) To sDocInfo At DOC_INFO_1.pDocName
>
> /// Open printer For Output To obtain Handle.
> /// Set it up To Begin recieving raw data.
> Move (APIOpenPrinter(sPrnName, ahPrn, (Character(0)))) To iRetVal
> If (Not(iRetVal)) Begin
> Send stop_box "Unable to open printer spooler." "Internal Error"
> Function_Return 1
> End
> Move (APIStartDocPrinter(hPrn, 1, sDocInfo)) To iRetVal
> If (Not(iRetVal)) Begin
> Move (APIClosePrinter(hPrn)) To iRetVal
> Send stop_box "Unable to start document printer." "Internal
Error"
> Function_Return 1
> End
> Move (APIStartPagePrinter(hPrn)) To iRetVal
> If (Not(iRetVal)) Begin
> Move (APIEndDocPrinter(hPrn)) To iRetVal
> Send stop_box "Unable to start page printer." "Internal Error"
> Function_Return 1
> End
>
> /// Output the string to the printer.
> Move (APIWritePrinter(hPrn, sData, (Length(sData)), aiWritten)) To
> iRetVal
> If (Not(iRetVal)) Begin
> Move (APIEndPagePrinter(hPrn)) To iRetVal
> Move (APIEndDocPrinter(hPrn)) To iRetVal
> Move (APIClosePrinter(hPrn)) To iRetVal
> Close_Input
> Send stop_box "Unable to write to printer spooler." "Internal
> Error"
> Function_Return 1
> End
>
> /// Shut down spooling process.
> Move (APIEndPagePrinter(hPrn)) To iRetVal
> Move (APIEndDocPrinter(hPrn)) To iRetVal
> Move (APIClosePrinter(hPrn)) To iRetVal
> Function_Return 0
> End_Function

Greg Sergeant
29-Aug-2005, 05:15 PM
Sorry to take so long. I haven't checked this in forever.

Add this to the top....

String gsNull
Move (Character(0)) To gsNull

/// structure required by API calls to send data to the print spooler
Type DOC_INFO_1
Field DOC_INFO_1.pDocName as Integer
Field DOC_INFO_1.pOutputFile as Integer
Field DOC_INFO_1.pDatatype as Integer
End_Type

/// structure required by API calls to send data to the print drivers
Type DOCINFO
Field DOCINFO.cbSize as Integer
Field DOCINFO.pDocName as Integer
Field DOCINFO.pOutputFile as Integer
Field DOCINFO.pDatatype as Integer
Field DOCINFO.fwType as DWORD
End_Type


Hope that does it.
Greg



Nicholas Herlick wrote:
> Greg,
>
> Question about the program logic. I pasted your code into a file named
> despool.pkg and used it in a test program. Got the compiler errors shown
> below. Can you point me in the right direction? Thanks! - Nick Herlick
>
> ERROR: 54 Invalid symbol in expression DOC_INFO_1_SIZE ON LINE: 58 (37888)
> OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 61 (37890) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 63 (37892) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression GSNULL ON LINE: 65 (37893) OF FILE:
> C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 66 (37894) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression DOC_INFO_1.PDOCNAME ON LINE: 66
> (37894) OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression DOC_INFO_1_SIZE ON LINE: 122 (37936)
> OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 125 (37938) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 127 (37940) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression GSNULL ON LINE: 129 (37941) OF FILE:
> C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 130 (37942) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression DOC_INFO_1.PDOCNAME ON LINE: 130
> (37942) OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression DOC_INFO_1_SIZE ON LINE: 58 (37888)
> OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 61 (37890) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 63 (37892) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression GSNULL ON LINE: 65 (37893) OF FILE:
> C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 66 (37894) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression DOC_INFO_1.PDOCNAME ON LINE: 66
> (37894) OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression DOC_INFO_1_SIZE ON LINE: 122 (37936)
> OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 125 (37938) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 127 (37940) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression GSNULL ON LINE: 129 (37941) OF FILE:
> C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression ADDRESSOF ON LINE: 130 (37942) OF
> FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
> ERROR: 54 Invalid symbol in expression DOC_INFO_1.PDOCNAME ON LINE: 130
> (37942) OF FILE: C:\dev\memsys40\AppSrc\DESPOOL.PKG
>
>
>
> "Greg Sergeant" <gsergeant@specialservicesystems.com> wrote in message
> news:Et4FoxCJFHA.1952@dacmail.dataaccess.com...
>
>>Here are a couple of methods I have used to print when I wanted to use
>>the spooler but didn't want the print driver interfering. Using this
>>method you can send escape sequences and such without having the driver
>>strip them out or freak out on them.
>>
>>
>>External_Function APIOpenPrinter "OpenPrinterA" winspool.drv ;
>> String pPrinterName ;
>> Integer phPrn ;
>> String pDefault ;
>> Returns Integer
>>
>>External_Function APIStartDocPrinter "StartDocPrinterA" winspool.drv ;
>> Integer hPrn ;
>> Integer level ;
>> String pDocInfo ;
>> Returns Integer
>>
>>External_Function APIStartPagePrinter "StartPagePrinter" winspool.drv ;
>> Integer hPrn ;
>> Returns Integer
>>
>>External_Function APIWritePrinter "WritePrinter" winspool.drv ;
>> Handle hPrn ;
>> String pBuf ;
>> Integer cdBuf ;
>> Address aWritten ;
>> Returns Integer
>>
>>External_Function APIEndPagePrinter "EndPagePrinter" winspool.drv ;
>> Integer hPrn ;
>> Returns Integer
>>
>>External_Function APIEndDocPrinter "EndDocPrinter" winspool.drv ;
>> Integer hPrn ;
>> Returns Integer
>>
>>External_Function APIClosePrinter "ClosePrinter" winspool.drv ;
>> Integer hPrn ;
>> Returns Integer
>>
>>
>>/// Prints a file to the specified printer through the windows print
>
> spooler
>
>>/// but bypasses the windows drivers
>>/// Returns an integer indicating success or failure
>>/// example of use
>>/// Get SpoolFile "c:\temp\test.txt", "HP DeskJet 850C Series" to iRetVal
>>Function SpoolFile global String sFile String sPrnName Returns Integer
>> Address aiWritten ahPrn
>> Handle hPrn
>> String sBuffer sDocInfo sJobName
>> Integer iWritten iRetVal
>> ZeroType DOC_INFO_1 To sDocInfo
>>
>> Move 0 To iWritten
>> Move (AddressOf(iWritten)) To aiWritten
>> Move 0 To hPrn
>> Move (AddressOf(hPrn)) To ahPrn
>> /// Fill the DOC_INFO_1 structure.
>> Move ("Customer Service" + gsNull) To sJobName
>> Put (AddressOf(sJobName)) To sDocInfo At DOC_INFO_1.pDocName
>>
>> /// Open printer For Output To obtain Handle.
>> /// Set it up To Begin receiving raw data.
>> Move (APIOpenPrinter(sPrnName, ahPrn, (Character(0)))) To iRetVal
>> If (Not(iRetVal)) Begin
>> Send stop_box "Unable to open printer spooler." "Internal Error"
>> Function_Return 1
>> End
>> Move (APIStartDocPrinter(hPrn, 1, sDocInfo)) To iRetVal
>> If (Not(iRetVal)) Begin
>> Move (APIClosePrinter(hPrn)) To iRetVal
>> Send stop_box "Unable to start document printer." "Internal
>
> Error"
>
>> Function_Return 1
>> End
>> Move (APIStartPagePrinter(hPrn)) To iRetVal
>> If (Not(iRetVal)) Begin
>> Move (APIEndDocPrinter(hPrn)) To iRetVal
>> Send stop_box "Unable to start page printer." "Internal Error"
>> Function_Return 1
>> End
>>
>> /// Open the file and pump it to the printer.
>> Direct_Input sFile
>> While (Not(Seqeof))
>> Read_Block sBuffer 2047
>> Move (APIWritePrinter(hPrn, sBuffer, (Length(sBuffer)),
>>aiWritten)) To iRetVal
>> If (Not(iRetVal)) Begin
>> Move (APIEndPagePrinter(hPrn)) To iRetVal
>> Move (APIEndDocPrinter(hPrn)) To iRetVal
>> Move (APIClosePrinter(hPrn)) To iRetVal
>> Close_Input
>> Send stop_box "Unable to write to printer spooler."
>>"Internal Error"
>> Function_Return 1
>> End
>> Loop
>> Close_Input
>>
>> /// Shut down spooling process.
>> Move (APIEndPagePrinter(hPrn)) To iRetVal
>> Move (APIEndDocPrinter(hPrn)) To iRetVal
>> Move (APIClosePrinter(hPrn)) To iRetVal
>> Function_Return 0
>>End_Function
>>
>>/// Prints a string to the specified printer through the windows print
>>spooler
>>/// but bypasses the windows drivers
>>/// Returns an integer indicating success or failure
>>/// example of use
>>/// Get SpoolString "Testing 123", "HP DeskJet 850C Series" to iRetVal
>>Function SpoolString global String sData String sPrnName Returns Integer
>> Address aiWritten ahPrn
>> Handle hPrn
>> Integer iWritten iRetVal
>> String sDocInfo sJobName
>> ZeroType DOC_INFO_1 To sDocInfo
>>
>> Move 0 To iWritten
>> Move (AddressOf(iWritten)) To aiWritten
>> Move 0 To hPrn
>> Move (AddressOf(hPrn)) To ahPrn
>> /// Fill the DOC_INFO_1 structure.
>> Move ("Customer Service" + gsNull) To sJobName
>> Put (AddressOf(sJobName)) To sDocInfo At DOC_INFO_1.pDocName
>>
>> /// Open printer For Output To obtain Handle.
>> /// Set it up To Begin recieving raw data.
>> Move (APIOpenPrinter(sPrnName, ahPrn, (Character(0)))) To iRetVal
>> If (Not(iRetVal)) Begin
>> Send stop_box "Unable to open printer spooler." "Internal Error"
>> Function_Return 1
>> End
>> Move (APIStartDocPrinter(hPrn, 1, sDocInfo)) To iRetVal
>> If (Not(iRetVal)) Begin
>> Move (APIClosePrinter(hPrn)) To iRetVal
>> Send stop_box "Unable to start document printer." "Internal
>
> Error"
>
>> Function_Return 1
>> End
>> Move (APIStartPagePrinter(hPrn)) To iRetVal
>> If (Not(iRetVal)) Begin
>> Move (APIEndDocPrinter(hPrn)) To iRetVal
>> Send stop_box "Unable to start page printer." "Internal Error"
>> Function_Return 1
>> End
>>
>> /// Output the string to the printer.
>> Move (APIWritePrinter(hPrn, sData, (Length(sData)), aiWritten)) To
>>iRetVal
>> If (Not(iRetVal)) Begin
>> Move (APIEndPagePrinter(hPrn)) To iRetVal
>> Move (APIEndDocPrinter(hPrn)) To iRetVal
>> Move (APIClosePrinter(hPrn)) To iRetVal
>> Close_Input
>> Send stop_box "Unable to write to printer spooler." "Internal
>>Error"
>> Function_Return 1
>> End
>>
>> /// Shut down spooling process.
>> Move (APIEndPagePrinter(hPrn)) To iRetVal
>> Move (APIEndDocPrinter(hPrn)) To iRetVal
>> Move (APIClosePrinter(hPrn)) To iRetVal
>> Function_Return 0
>>End_Function
>
>
>