给你个不完整的代码参考参考~~
$PBExportHeader$n_printer.sru
$PBExportComments$关于打印机的封装
forward
global type n_printer from nonvisualobject
end type
end forward
type str_printer_info_1 from structure
long flags
long Description
long name
long comment
end type
type str_printer_info_2 from structure
long servername
long printername
long sharename
long portname
long drivername
long comment
long location
long devmode
long sepfile
long printprocessor
long datatype
long parameters
long securitydescriptor
long attributes
long priority
long defaultpriority
long starttime
long untiltime
long status
long cjobs
long averageppm
character reserve[500]
end type
type str_devnames from structure
UINT wDriverOffset
UINT wDeviceOffset
UINT wOutputOffset
UINT wDefault
character drivername[32]
character devicename[32]
character portname[32]
end type
type str_point from structure
long x
long y
end type
type str_rect from structure
long left
long top
long right
long bottom
end type
type str_PAGESETUPDLG from structure
ulong lStructSize
ulong hwndOwner
ulong hDevMode
ulong hDevNames
ulong Flags
str_point ptPaperSize
str_rect rtMinMargin
str_rect rtMargin
ulong hInstance
ulong lCustData
ulong lpfnPageSetupHook
ulong lpfnPagePaintHook
ulong lpPageSetupTemplateName
ulong hPageSetupTemplate
end type
global type n_printer from nonvisualobject autoinstantiate
end type
type prototypes
function boolean EnumPrinters(ulong flags, string name, ulong level, ref blob buffer, ulong cbbuf, ref ulong cbneeded, ref ulong returned) library "winspool.drv" alias for "EnumPrintersA"
function ulong CopyMem ( ref str_printer_info_1 dest, ref blob source, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function ulong CopyMem ( ref str_printer_info_2 dest, ref blob source, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function ulong CopyMem ( ref blob source, ref str_printer_info_2 dest, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function boolean OpenPrinter ( string PrinterName, ref ulong hPrinter, ulong null) library "winspool.drv" alias for "OpenPrinterA"
function boolean OpenPrinter ( string PrinterName, ref ulong hPrinter, ref str_printer_defaults null) library "winspool.drv" alias for "OpenPrinterA"
function boolean ClosePrinter ( ulong hPrinter ) library "winspool.drv"
function boolean GetPrinter ( ulong hPrinter, ulong level, ref blob Printer, ulong cbbuf, ref ulong cbNeeded ) library "winspool.drv" alias for "GetPrinterA"
function boolean SetPrinter ( ulong hPrinter, ulong level, ref blob Printer, ulong command ) library "winspool.drv" alias for "SetPrinterA"
function boolean PrinterProperties ( ulong hwnd, ulong hprinter ) library "winspool.drv"
function ulong CopyMem ( ref str_devmode dest, ref blob src, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function ulong CopyMem ( ref str_devmode dest, ulong src, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function ulong CopyMem ( ref blob src, ref str_devmode dest, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function ulong CopyMem ( ulong src, ref str_devmode dest, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ref blob DevModeOutput, long null_1, ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA"
function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ulong null_1, ref str_devmode pDevModeInput , ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA"
function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ulong null_1, ref blob pDevModeInput , ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA"
function long DeviceCapabilities ( string Device, string Port, uint fwCapability, ref blob pOutput, long devmode ) library "winspool.drv" alias for "DeviceCapabilitiesA"
function long DeviceCapabilities ( string Device, string Port, uint fwCapability, long null, long devmode ) library "winspool.drv" alias for "DeviceCapabilitiesA"
function ulong CreateDC ( long driver, string device, long output, long devmode ) library "gdi32" alias for "CreateDCA"
function boolean DeleteDC ( ulong hdc ) library "gdi32"
function int Escape ( ulong hdc, int nEscape, int cbInput, long inData, ref blob outdata ) library "gdi32"
function ulong GlobalAlloc(uint uFlags, ulong dwBytes ) library "kernel32"
function ulong GlobalFree ( ulong hmem ) library "kernel32"
function ulong GlobalLock ( ulong hmem ) library "kernel32"
function boolean GlobalUnlock (ulong hmem ) library "kernel32"
function ulong GlobalSize ( ulong hem ) library "kernel32"
function long PrintDlg(ref str_printdlg printdlg) library "comdlg32" alias for "PrintDlgA"
function ulong CopyMem ( ref str_devnames dest, ulong src, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function ulong CopyMem ( ref blob dest, ulong src, ulong length ) library "kernel32" alias for "RtlMoveMemory"
function boolean PageSetupDlg(ref str_pagesetupdlg ll ) library "comdlg32" alias for "PageSetupDlgA"
end prototypes
constant ulong PSD_DEFAULTMINMARGINS = 0000000 // default (printer's)
constant ulong PSD_INWININIINTLMEASURE = 0000000 // 1st of 4 possible
constant ulong PSD_MINMARGINS = 0000001 // use caller's
constant ulong PSD_MARGINS = 0000002 // use caller's
constant ulong PSD_INTHOUSANDTHSOFINCHES = 0000004 // 2nd of 4 possible
constant ulong PSD_INHUNDREDTHSOFMILLIMETERS = 0000008 // 3rd of 4 possible
constant ulong PSD_DISABLEMARGINS = 16
constant ulong PSD_DISABLEPRINTER = 32
constant ulong PSD_NOWARNING = 128 // must be same as PD_*
constant ulong PSD_DISABLEORIENTATION = 256
constant ulong PSD_RETURNDEFAULT = 1024 // must be same as PD_*
constant ulong PSD_DISABLEPAPER = 512
constant ulong PSD_SHOWHELP = 2048 // must be same as PD_*
constant ulong PSD_ENABLEPAGESETUPHOOK = 8192 // must be same as PD_*
constant ulong PSD_ENABLEPAGESETUPTEMPLATE = 32768 // must be same as PD_*
constant ulong PSD_ENABLEPAGESETUPTEMPLATEHANDLE = 131072 // must be same as PD_*
constant ulong PSD_ENABLEPAGEPAINTHOOK = 262144
constant ulong PSD_DISABLEPAGEPAINTING = 524288
constant ulong PSD_NONETWORKBUTTON = 2097152 // must be same as PD_*
constant int PAGESETUPDLG_LEN = 84
end variables
forward prototypes
public function integer of_getprinterlist (ref string printerlist[])
public function integer of_direct (string PrinterName, string data)
public function integer of_printer (string printername, integer command, ref any outpara, ref integer papersize, ref integer paperwidth, ref integer paperlength)
public function string of_getdrivername (string PrinterName)
public function string of_getportname (string printername)
public function int of_getattribute (string printername)
public function long of_getstatus (string printername)
public function integer of_getpapersize (string printername, ref integer papersize, ref integer paperwidth, ref integer paperheight)
public function string of_getpbprinter ()
public function integer of_setdefault (string printername)
private function string of_getstringfromblob (blob source, integer offset)
private function integer of_modifyprinter (string printername, str_devmode devmode)
public function integer of_printsetup (unsignedlong hwnd)
public function integer of_setpapersize (string printername, integer papersize, integer paperwidth, integer paperheight)
public function integer of_pagesetup (unsignedlong hwnd, ref long left, ref long right, ref long top, ref long bottom)
public function integer of_setdwpapersize (readonly datawindow adw_dw, integer ai_w, integer ai_h)
public function integer of_setdspapersize (readonly datastore adw_dw, integer ai_w, integer ai_h)
end prototypes
l_GetPrinter:
lbl_buffer = Blob ( Space ( li_size ) )
SetNull ( ls_Name )
If Not EnumPrinters( PRINTER_ENUM_LOCAL, ls_Name, 2, ref lbl_buffer, li_size, ll_cbNeeded, ll_Returned ) Then
If li_size < ll_cbNeeded Then
li_size = ll_cbNeeded
Goto l_GetPrinter
Else
Return -1
End If
End If
// 打开打印机
If Not OpenPrinter ( printername, ll_handle, ref lstr_default ) Then Return -1
ll_cbbuf = 0
// 取打印机驱动名称
ll_cbBuf = 0
l_SetBuffer:
lbl_buffer = Blob ( Space ( ll_cbBuf ) )
If Not GetPrinter ( ll_handle, 2, ref lbl_buffer, ll_cbBuf, ll_cbNeeded ) Then
If ll_cbNeeded > ll_cbBuf Then
ll_cbBuf = ll_cbNeeded
Goto l_SetBuffer
Else
Return -1
End If
End If
Choose Case command
Case 101,102
lstr_devMode.dmPaperSize = papersize
lstr_devMode.dmFields = DM_PAPERSIZE
If PaperSize = DMPAPER_USER Then
lstr_devMode.dmPaperWidth = paperwidth
lstr_devMode.dmPaperLength = paperlength
lstr_devMode.dmFields += DM_PAPERLENGTH + DM_PAPERWIDTH
End If
Case 103
lstr_devMode.dmOrientation = outpara
lstr_devMode.dmFields = DM_ORIENTATION
End Choose
public function string of_getpbprinter ();String ls_printer
Integer li_Pos
ls_printer = ProfileString ( "win.ini", "windows", "device", "" )
If ls_printer = "" then Return ""
li_Pos = Pos ( ls_printer, "," )
If li_Pos <> 0 Then
ls_printer = Left ( ls_printer, li_Pos - 1 )
End If
Return ls_printer
end function
public function integer of_setdefault (string printername);// 设置为缺省打印机
integer li_size, li_width, li_length
any la_any
Return of_Printer( printername, 105, la_any, li_size, li_width, li_length )
end function
private function string of_getstringfromblob (blob source, integer offset);// 从指定位置得到一个以0结束的字符串
String ls_char, ls_target
Integer li_i
For li_i = offset To Len ( source )
ls_char = String ( BlobMid ( source, li_i, 1 ) )
If Len ( ls_char ) = 0 Then Exit
ls_target += ls_char
Next
// 打开打印机
If Not OpenPrinter ( printername, ll_handle, ref lstr_default ) Then Return -1
ll_cbbuf = 0
// 取打印机驱动名称
ll_cbBuf = 0
l_SetBuffer:
lbl_buffer = Blob ( Space ( ll_cbBuf ) )
If Not GetPrinter ( ll_handle, 2, ref lbl_buffer, ll_cbBuf, ll_cbNeeded ) Then
If ll_cbNeeded > ll_cbBuf Then
ll_cbBuf = ll_cbNeeded
Goto l_SetBuffer
Else
li_rc = -1
Goto l_quit
End If
End If
Left = lstr_Dlg.rtMargin.Left
Right = lstr_Dlg.rtMargin.Right
Top = lstr_Dlg.rtMargin.Top
Bottom = lstr_Dlg.rtMargin.Bottom
Else
Return -1
End If
Return 1
end function
public function integer of_setdwpapersize (readonly datawindow adw_dw, integer ai_w, integer ai_h);string ls_printer
ls_printer=adw_dw.object.datawindow.printer
ls_printer=trim(left(ls_printer,pos(ls_printer," on ")))
if of_SetPaperSize ( ls_printer, 256, ai_w, ai_h )<>1 then return -1
return of_SetDefault ( ls_printer )
end function
public function integer of_setdspapersize (readonly datastore adw_dw, integer ai_w, integer ai_h);string ls_printer
ls_printer=adw_dw.object.datawindow.printer
ls_printer=trim(left(ls_printer,pos(ls_printer," on ")))
If of_SetPaperSize ( ls_printer, 256, ai_w, ai_h ) = 1 Then return 1
return -1
end function
on n_printer.create
TriggerEvent( this, "constructor" )
end on
on n_printer.destroy
TriggerEvent( this, "destructor" )
end on