Hi Michael...

We use this classes

Code:

External_Function WinAPI_GetDefaultPrinter "GetDefaultPrinterA" Winspool.Drv ;
Address pszBuffer UInteger pcchBuffer Returns Boolean


External_Function WinAPI_SetDefaultPrinter "SetDefaultPrinterA" Winspool.Drv ;
Address pszBuffer Returns Boolean


Class cGvmDefaultPrinter is a cObject
    
    Function DefaultPrinter Returns String
        String sPrinterName
        Integer iBufferSize 
        Boolean bSuccess
        Move 0 to iBufferSize
        Move (WinAPI_GetDefaultPrinter (0, AddressOf (iBufferSize))) to bSuccess
        If (not (bSuccess)) Begin
            ZeroString iBufferSize to sPrinterName
            Move (WinAPI_GetDefaultPrinter (AddressOf (sPrinterName), AddressOf (iBufferSize))) to bSuccess
        End
        Move (CString (sPrinterName)) to sPrinterName
        Function_Return sPrinterName
    End_Function


    Function ChangeDefaultPrinter String sPrinterName Returns Boolean
        Boolean bSuccess
        Move (WinAPI_SetDefaultPrinter (AddressOf (sPrinterName))) to bSuccess
        Function_Return bSuccess
    End_Function
    
End_Class


String gsNull
Move (Character(0)) to gsNull
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


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


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


Class cGvmRawPrinting is a cObject
    
    Procedure Construct_Object
        Forward Send Construct_Object
    End_Procedure


/// Get SpoolFile "c:\temp\test.txt", "HP DeskJet 850C Series" to iRetVal


    Function SpoolFile 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 ("GVM 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, '')) 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 printspooler
    /// 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 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 ("GVM 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
        Move (APIOpenPrinter(sPrnName, ahPrn, '')) 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    
    
End_Class
And print this way

Code:
Object oDirectPrinter is a cGvmRawPrinting
End_Object


Get SpoolFile of oDirectPrinter vs_file vs_printername to vi_err