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