$PBExportHeader$uo_rpt_printer_setting.sru forward global type uo_rpt_printer_setting from nonvisualobject end type type str_printer_info_1 from structure within uo_rpt_printer_setting end type type str_printer_info_2 from structure within uo_rpt_printer_setting end type type str_devmode from structure within uo_rpt_printer_setting end type type str_printer_defaults from structure within uo_rpt_printer_setting end type type str_printdlg from structure within uo_rpt_printer_setting end type type str_devnames from structure within uo_rpt_printer_setting end type type str_point from structure within uo_rpt_printer_setting end type type str_rect from structure within uo_rpt_printer_setting end type type str_pagesetupdlg from structure within uo_rpt_printer_setting 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_devmode from structure character dmdevicename[32] unsignedinteger dmspecversion unsignedinteger dmdriverversion unsignedinteger dmsize unsignedinteger dmdriverextra unsignedlong dmfields unsignedinteger dmorientation unsignedinteger dmpapersize unsignedinteger dmpaperlength unsignedinteger dmpaperwidth integer dmscale integer dmcopies integer dmdefaultsource integer dmprintquality integer dmcolor integer dmduplex integer dmyresolution integer dmttoption integer dmcollate character dmformname[32] unsignedinteger dmlogpixels unsignedlong dmbitsperpel unsignedlong dmpelswidth unsignedlong dmpelsheight unsignedlong dmdisplayflags unsignedlong dmdisplayfrequency unsignedlong dmicmmethod unsignedlong dmicmintent unsignedlong dmmediatype unsignedlong dmdithertype unsignedlong dmreserved1 unsignedlong dmreserved2 unsignedlong dmreserved3 end type type str_printer_defaults from structure long Datatype long DevMode long DesiredAccess end type type str_printdlg from structure unsignedlong lstructsize unsignedlong hwndowner unsignedlong hdevmode unsignedlong hdevnames unsignedlong hdc unsignedlong flags unsignedinteger nfrompage unsignedinteger ntopage unsignedinteger nminpage unsignedinteger nmaxpage unsignedinteger ncopies unsignedlong hinstance unsignedlong lcustdata unsignedlong lpfnprinthook unsignedlong lpfnsetuphook unsignedlong lpprinttemplatename unsignedlong lpsetuptemplatename unsignedlong hprinttemplate unsignedlong hsetuptemplate uint reserve1 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 uo_rpt_printer_setting 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;Ansi" function ulong CopyMem ( ref str_printer_info_1 dest, ref blob source, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi" function ulong CopyMem ( ref str_printer_info_2 dest, ref blob source, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi" function ulong CopyMem ( ref blob source, ref str_printer_info_2 dest, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi" function boolean OpenPrinter ( string PrinterName, ref ulong hPrinter, ulong null) library "winspool.drv" alias for "OpenPrinterA;Ansi" function boolean OpenPrinter ( string PrinterName, ref ulong hPrinter, ref str_printer_defaults null) library "winspool.drv" alias for "OpenPrinterA;Ansi" 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;Ansi" function ulong CopyMem ( ref str_devmode dest, ulong src, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi" function ulong CopyMem ( ref blob src, ref str_devmode dest, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi" function ulong CopyMem ( ulong src, ref str_devmode dest, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi" function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ref blob DevModeOutput, long null_1, ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA;Ansi" function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ulong null_1, ref str_devmode pDevModeInput , ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA;Ansi" function long DocumentProperties ( ulong hwnd, ulong hprinter, string null, ulong null_1, ref blob pDevModeInput , ulong fMode ) library "winspool.drv" alias for "DocumentPropertiesA;Ansi" function long DeviceCapabilities ( string Device, string Port, uint fwCapability, ref blob pOutput, long devmode ) library "winspool.drv" alias for "DeviceCapabilitiesA;Ansi" function long DeviceCapabilities ( string Device, string Port, uint fwCapability, long null, long devmode ) library "winspool.drv" alias for "DeviceCapabilitiesA;Ansi" function ulong CreateDC ( long driver, string device, long output, long devmode ) library "gdi32" alias for "CreateDCA;Ansi" 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;Ansi" function ulong CopyMem ( ref str_devnames dest, ulong src, ulong length ) library "kernel32" alias for "RtlMoveMemory;Ansi" 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;Ansi" end prototypes type variables constant ulong PRINTER_ENUM_DEFAULT = 1 constant ulong PRINTER_ENUM_LOCAL = 2 constant ulong PRINTER_ENUM_CONNECTIONS = 4 constant ulong PRINTER_ENUM_FAVORITE = 4 constant ulong PRINTER_ENUM_NAME = 8 constant ulong PRINTER_ENUM_REMOTE = 16 constant ulong PRINTER_ENUM_SHARED = 32 constant ulong PRINTER_ENUM_NETWORK = 64 constant ulong PRINTER_ENUM_EXPAND = 16384 constant ulong PRINTER_ENUM_CONTAINER = 32768 constant ulong PRINTER_ENUM_ICONMASK = 16711680 constant ulong PRINTER_ENUM_ICON1 = 65536 constant ulong PRINTER_ENUM_ICON2 = 131072 constant ulong PRINTER_ENUM_ICON3 = 262144 constant ulong PRINTER_ENUM_ICON4 = 545288 constant ulong PRINTER_ENUM_ICON5 = 1048576 constant ulong PRINTER_ENUM_ICON6 = 2097152 constant ulong PRINTER_ENUM_ICON7 = 4194304 constant ulong PRINTER_ENUM_ICON8 = 8388608 constant integer PRINTER_INFO_1_LEN = 16 constant integer PRINTER_INFO_2_LEN = 84 constant integer DEVMODE_LEN = 148 constant ulong DM_ORIENTATION = 00000001 constant ulong DM_PAPERSIZE = 00000002 constant ulong DM_PAPERLENGTH = 00000004 constant ulong DM_PAPERWIDTH = 00000008 constant ulong DM_SCALE = 00000016 constant ulong DM_COPIES = 00000256 constant ulong DM_DEFAULTSOURCE = 00000512 constant ulong DM_PRINTQUALITY = 000001024 constant ulong DM_COLOR = 000002048 constant ulong DM_DUPLEX = 00004096 constant ulong DM_YRESOLUTION = 00008192 constant ulong DM_TTOPTION = 000016384 constant ulong DM_COLLATE = 32768 constant ulong DM_FORMNAME = 65536 constant ulong DM_LOGPIXELS = 131072 constant ulong DM_BITSPERPEL = 262144 constant ulong DM_PELSWIDTH = 524288 constant ulong DM_PELSHEIGHT = 1048576 constant ulong DM_DISPLAYFLAGS = 2097152 constant ulong DM_DISPLAYFREQUENCY = 4194304 constant ulong DM_ICMMETHOD = 8388608 constant ulong DM_ICMINTENT = 16777216 constant ulong DM_MEDIATYPE = 33554432 constant ulong DM_DITHERTYPE = 67108864 constant ulong DM_PANNINGWIDTH = 134217728 constant ulong DM_PANNINGHEIGHT = 268435456 /* orientation selections */ constant ulong DMORIENT_PORTRAIT = 1 constant ulong DMORIENT_LANDSCAPE = 2 constant ulong PRINTER_ATTRIBUTE_QUEUED = 0001 constant ulong PRINTER_ATTRIBUTE_DIRECT = 0002 constant ulong PRINTER_ATTRIBUTE_DEFAULT = 0004 constant ulong PRINTER_ATTRIBUTE_SHARED = 0008 constant ulong PRINTER_ATTRIBUTE_NETWORK = 0016 constant ulong PRINTER_ATTRIBUTE_HIDDEN = 0032 constant ulong PRINTER_ATTRIBUTE_LOCAL = 0064 constant ulong PRINTER_ATTRIBUTE_ENABLE_DEVQ = 128 constant ulong PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS = 256 constant ulong PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST = 512 constant ulong PRINTER_ATTRIBUTE_WORK_OFFLINE = 1024 constant ulong PRINTER_ATTRIBUTE_ENABLE_BIDI = 2048 constant ulong PRINTER_ATTRIBUTE_RAW_ONLY = 4096 constant ulong DM_IN_BUFFER = 8 constant ulong DM_IN_PROMPT = 4 constant ulong DM_OUT_BUFFER = 2 constant ulong DM_OUT_DEFAULT = 1 constant ulong DC_FIELDS = 1 constant ulong DC_PAPERS = 2 constant ulong DC_PAPERSIZE = 3 constant ulong DC_MINEXTENT = 4 constant ulong DC_MAXEXTENT = 5 constant ulong DC_BINS = 6 constant ulong DC_DUPLEX = 7 constant ulong DC_SIZE = 8 constant ulong DC_EXTRA = 9 constant ulong DC_VERSION = 10 constant ulong DC_DRIVER = 11 constant ulong DC_BINNAMES = 12 constant ulong DC_ENUMRESOLUTIONS = 13 constant ulong DC_FILEDEPENDENCIES= 14 constant ulong DC_TRUETYPE = 15 constant ulong DC_PAPERNAMES = 16 constant ulong DC_ORIENTATION = 17 constant ulong DC_COPIES = 18 constant uint DMPAPER_LETTER = 1 /* Letter 8 1/2 x 11 in */ constant uint DMPAPER_LETTERSMALL = 2 /* Letter Small 8 1/2 x 11 in */ constant uint DMPAPER_TABLOID = 3 /* Tabloid 11 x 17 in */ constant uint DMPAPER_LEDGER = 4 /* Ledger 17 x 11 in */ constant uint DMPAPER_LEGAL = 5 /* Legal 8 1/2 x 14 in */ constant uint DMPAPER_STATEMENT = 6 /* Statement 5 1/2 x 8 1/2 in */ constant uint DMPAPER_EXECUTIVE = 7 /* Executive 7 1/4 x 10 1/2 in */ constant uint DMPAPER_A3 = 8 /* A3 297 x 420 mm */ constant uint DMPAPER_A4 = 9 /* A4 210 x 297 mm */ constant uint DMPAPER_A4SMALL = 10 /* A4 Small 210 x 297 mm */ constant uint DMPAPER_A5 = 11 /* A5 148 x 210 mm */ constant uint DMPAPER_B4 = 12 /* B4 (JIS) 250 x 354 */ constant uint DMPAPER_B5 = 13 /* B5 (JIS) 182 x 257 mm */ constant uint DMPAPER_FOLIO = 14 /* Folio 8 1/2 x 13 in */ constant uint DMPAPER_QUARTO = 15 /* Quarto 215 x 275 mm */ constant uint DMPAPER_10X14 = 16 /* 10x14 in */ constant uint DMPAPER_11X17 = 17 /* 11x17 in */ constant uint DMPAPER_NOTE = 18 /* Note 8 1/2 x 11 in */ constant uint DMPAPER_ENV_9 = 19 /* Envelope #9 3 7/8 x 8 7/8 */ constant uint DMPAPER_ENV_10 = 20 /* Envelope #10 4 1/8 x 9 1/2 */ constant uint DMPAPER_ENV_11 = 21 /* Envelope #11 4 1/2 x 10 3/8 */ constant uint DMPAPER_ENV_12 = 22 /* Envelope #12 4 \276 x 11 */ constant uint DMPAPER_ENV_14 = 23 /* Envelope #14 5 x 11 1/2 */ constant uint DMPAPER_CSHEET = 24 /* C size sheet */ constant uint DMPAPER_DSHEET = 25 /* D size sheet */ constant uint DMPAPER_ESHEET = 26 /* E size sheet */ constant uint DMPAPER_ENV_DL = 27 /* Envelope DL 110 x 220mm */ constant uint DMPAPER_ENV_C5 = 28 /* Envelope C5 162 x 229 mm */ constant uint DMPAPER_ENV_C3 = 29 /* Envelope C3 324 x 458 mm */ constant uint DMPAPER_ENV_C4 = 30 /* Envelope C4 229 x 324 mm */ constant uint DMPAPER_ENV_C6 = 31 /* Envelope C6 114 x 162 mm */ constant uint DMPAPER_ENV_C65 = 32 /* Envelope C65 114 x 229 mm */ constant uint DMPAPER_ENV_B4 = 33 /* Envelope B4 250 x 353 mm */ constant uint DMPAPER_ENV_B5 = 34 /* Envelope B5 176 x 250 mm */ constant uint DMPAPER_ENV_B6 = 35 /* Envelope B6 176 x 125 mm */ constant uint DMPAPER_ENV_ITALY = 36 /* Envelope 110 x 230 mm */ constant uint DMPAPER_ENV_MONARCH = 37 /* Envelope Monarch 3.875 x 7.5 in */ constant uint DMPAPER_ENV_PERSONAL = 38 /* 6 3/4 Envelope 3 5/8 x 6 1/2 in */ constant uint DMPAPER_FANFOLD_US = 39 /* US Std Fanfold 14 7/8 x 11 in */ constant uint DMPAPER_FANFOLD_STD_GERMAN = 40 /* German Std Fanfold 8 1/2 x 12 in */ constant uint DMPAPER_FANFOLD_LGL_GERMAN = 41 /* German Legal Fanfold 8 1/2 x 13 in */ constant uint DMPAPER_ISO_B4 = 42 /* B4 (ISO) 250 x 353 mm */ constant uint DMPAPER_JAPANESE_POSTCARD = 43 /* Japanese Postcard 100 x 148 mm */ constant uint DMPAPER_9X11 = 44 /* 9 x 11 in */ constant uint DMPAPER_10X11 = 45 /* 10 x 11 in */ constant uint DMPAPER_15X11 = 46 /* 15 x 11 in */ constant uint DMPAPER_ENV_INVITE = 47 /* Envelope Invite 220 x 220 mm */ constant uint DMPAPER_RESERVED_48 = 48 /* RESERVED--DO NOT USE */ constant uint DMPAPER_RESERVED_49 = 49 /* RESERVED--DO NOT USE */ constant uint DMPAPER_LETTER_EXTRA = 50 /* Letter Extra 9 \275 x 12 in */ constant uint DMPAPER_LEGAL_EXTRA = 51 /* Legal Extra 9 \275 x 15 in */ constant uint DMPAPER_TABLOID_EXTRA = 52 /* Tabloid Extra 11.69 x 18 in */ constant uint DMPAPER_A4_EXTRA = 53 /* A4 Extra 9.27 x 12.69 in */ constant uint DMPAPER_LETTER_TRANSVERSE = 54 /* Letter Transverse 8 \275 x 11 in */ constant uint DMPAPER_A4_TRANSVERSE = 55 /* A4 Transverse 210 x 297 mm */ constant uint DMPAPER_LETTER_EXTRA_TRANSVERSE =56 /* Letter Extra Transverse 9\275 x 12 in */ constant uint DMPAPER_A_PLUS = 57 /* SuperA/SuperA/A4 227 x 356 mm */ constant uint DMPAPER_B_PLUS = 58 /* SuperB/SuperB/A3 305 x 487 mm */ constant uint DMPAPER_LETTER_PLUS = 59 /* Letter Plus 8.5 x 12.69 in */ constant uint DMPAPER_A4_PLUS = 60 /* A4 Plus 210 x 330 mm */ constant uint DMPAPER_A5_TRANSVERSE = 61 /* A5 Transverse 148 x 210 mm */ constant uint DMPAPER_B5_TRANSVERSE = 62 /* B5 (JIS) Transverse 182 x 257 mm */ constant uint DMPAPER_A3_EXTRA = 63 /* A3 Extra 322 x 445 mm */ constant uint DMPAPER_A5_EXTRA = 64 /* A5 Extra 174 x 235 mm */ constant uint DMPAPER_B5_EXTRA = 65 /* B5 (ISO) Extra 201 x 276 mm */ constant uint DMPAPER_A2 = 66 /* A2 420 x 594 mm */ constant uint DMPAPER_A3_TRANSVERSE = 67 /* A3 Transverse 297 x 420 mm */ constant uint DMPAPER_A3_EXTRA_TRANSVERSE = 68 /* A3 Extra Transverse 322 x 445 mm */ constant uint DMPAPER_USER = 256 constant uint GMEM_MOVEABLE = 2 constant int PRINTDLG_LEN = 66 constant ulong PD_ALLPAGES = 000000 constant ulong PD_SELECTION = 000001 constant ulong PD_PAGENUMS = 000002 constant ulong PD_NOSELECTION = 000004 constant ulong PD_NOPAGENUMS = 000008 constant ulong PD_COLLATE = 000016 constant ulong PD_PRINTTOFILE = 000032 constant ulong PD_PRINTSETUP = 000064 constant ulong PD_NOWARNING = 0000128 constant ulong PD_RETURNDC = 256 constant ulong PD_RETURNIC = 512 constant ulong PD_RETURNDEFAULT = 1024 constant ulong PD_SHOWHELP = 2048 constant ulong PD_ENABLEPRINTHOOK = 4096 constant ulong PD_ENABLESETUPHOOK = 8192 constant ulong PD_ENABLEPRINTTEMPLATE = 16384 constant ulong PD_ENABLESETUPTEMPLATE = 32768 constant ulong PD_ENABLEPRINTTEMPLATEHANDLE = 65536 constant ulong PD_ENABLESETUPTEMPLATEHANDLE = 131072 constant ulong PD_USEDEVMODECOPIES = 262144 constant ulong PD_USEDEVMODECOPIESANDCOLLATE = 524288 constant ulong PD_DISABLEPRINTTOFILE = 1048576 constant ulong PD_HIDEPRINTTOFILE = 2097152 constant ulong PD_NONETWORKBUTTON = 4194304 constant int DEVNAMES_LEN = 32 * 3 +8 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) end prototypes public function integer of_getprinterlist (ref string printerlist[]);// 取打印机列表 // 在printerlist[]中返回 // 返回值为打印机个数,返回-1,错误 integer li_Count , li_Size, li_i String ls_Name Blob lbl_buffer, lbl_tmp ,lbl_buffer_net ulong ll_cbNeeded, ll_Returned,ll_Returned_net str_Printer_info_2 lstr_info li_Size = 1 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 // cjh -020728 l_GetPrinter_net: lbl_buffer_net = Blob ( Space ( li_size ) ) SetNull ( ls_Name ) If Not EnumPrinters( PRINTER_ENUM_CONNECTIONS, ls_Name, 2, ref lbl_buffer_net, li_size, ll_cbNeeded, ll_Returned_net ) Then If li_size < ll_cbNeeded Then li_size = ll_cbNeeded Goto l_GetPrinter_net Else Return -1 End If End If string ls_desc, ls_pname, ls_comment For li_i = 1 To integer ( ll_Returned )+integer ( ll_Returned_net ) lbl_tmp = BlobMid ( lbl_buffer, (li_i -1 ) * PRINTER_INFO_2_LEN + 1 ) CopyMem ( lstr_info, lbl_tmp, PRINTER_INFO_2_LEN ) printerlist [ li_i ] = String ( lstr_info.PrinterName, "address" ) ls_pname = string ( lstr_info.PortName, "address" ) Next For li_i =integer ( ll_Returned )+1 To integer ( ll_Returned )+integer ( ll_Returned_net ) lbl_tmp = BlobMid ( lbl_buffer_net, (li_i -1 - integer ( ll_Returned )) * PRINTER_INFO_2_LEN + 1 ) CopyMem ( lstr_info, lbl_tmp, PRINTER_INFO_2_LEN ) printerlist [ li_i ] = String ( lstr_info.PrinterName, "address" ) ls_pname = string ( lstr_info.PortName, "address" ) Next Return Integer ( ll_Returned )+integer ( ll_Returned_net ) // cjh -020728 end function public function integer of_direct (string PrinterName, string data);// 绕过windows直接向打印机发送字符 // PrinterName: 打印机名称 // data: 需要发送的数据 // 返回: 1 = 成功, 2 = 失败 ulong ll_handle // 建立打印机handle ll_handle = CreateDC ( 0, PrinterName, 0, 0 ) DeleteDC ( ll_handle ) Return 1 end function public function integer of_printer (string printername, integer command, ref any outpara, ref integer papersize, ref integer paperwidth, ref integer paperlength);// 与打印机有关的操作 // PrinterName:打印机名称 // Command:命令 // =1: 取打印机驱动名称 // = 2: 取打印机端口名称 // = 3: 取打印机状态 // = 4: 取打印机属性 // = 5: 取打印机纸张 // = 6: 取打印机自定义纸张的大小 // = 7: 取打印方向 // = 8: 设置为缺省打印机 // = 101: 设置打印机的纸张 // = 102: 将打印机设为自定义纸张并设定自定义纸张的大小 // = 103: 设置打印方向 // outpara: 1,2,3,4, 打印机参数由此返回 // papersize: 打印纸大小 // pagerwidth, pagerheight:自定义打印纸尺 // 取得打印机打印纸 // return 1: 成功 // return -1: 不成功 str_Printer_info_2 lstr_info str_Printer_defaults lstr_default str_devmode lstr_devmode Integer li_rc, li_i string ls_DriverName, ls_PortName ulong ll_handle, ll_cbbuf, ll_cbNeeded blob lbl_buffer // 打开打印机 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 // copy 至结构 CopyMem ( lstr_info, lbl_buffer, PRINTER_INFO_2_LEN ) // 驱动名、端口 ls_DriverName = String ( lstr_info.DriverName, "address" ) ls_PortName = String ( lstr_info.PortName, "address" ) Choose Case Command Case 1 // 驱动名称 OutPara = ls_DriverName li_rc = 1 Goto l_quit Case 2 // 端口名称 OutPara = ls_PortName li_rc = 1 Goto l_quit Case 3 // 打印机状态 OutPara = lstr_info.Status li_rc = 1 Goto l_quit Case 4 // 打印机属性 OutPara = lstr_info.Attributes li_rc = 1 Goto l_quit Case 5,6 // 打印纸大小 CopyMem ( lstr_devmode, lstr_info.DevMode, DEVMODE_LEN ) papersize = lstr_devMode.dmPaperSize paperwidth = lstr_devMode.dmPaperWidth paperlength = lstr_devMode.dmPaperLength li_rc = 1 Goto l_quit Case 7 // 打印方向 CopyMem ( lstr_devmode, lstr_info.DevMode, DEVMODE_LEN ) OutPara = lstr_devMode.dmOrientation li_rc = 1 Goto l_quit Case 105 // 设置为缺省打印机 lstr_info.Attributes += PRINTER_ATTRIBUTE_DEFAULT CopyMem ( lbl_buffer, lstr_info, PRINTER_INFO_2_LEN ) If SetPrinter ( ll_handle , 2, lbl_buffer, 0 ) Then li_rc = 1 Else li_rc = -1 end If Goto l_quit End Choose If Command = 101 Or Command = 102 Then // 取打印机支持的纸张 SetNull ( lbl_buffer ) ll_cbbuf = DeviceCapabilities ( printername, ls_PortName, DC_PAPERS, 0, 0 ) lbl_buffer = Blob ( Space ( 1024 ) ) // ll_cbbuf ) ) ll_cbbuf = DeviceCapabilities ( PrinterName, ls_PortName, DC_PAPERS, lbl_buffer, 0 ) If ll_cbbuf < 0 Then Return -1 // 检查是否支持用户指定纸张 For li_i =1 To Integer ( ll_cbbuf ) If integer ( BlobMid ( lbl_buffer, ( li_i - 1 ) * 2 + 1, 2 ) ) = papersize Then Exit Next If li_i > Integer ( ll_cbbuf ) Then // 不支持自定久纸张 Return -1 End If End If // 取需要的空间 ll_cbbuf =DocumentProperties ( 0, ll_handle, ls_DriverName, ref lbl_buffer, 0 , 0 ) If ll_cbbuf < 0 Then li_rc = -1 Goto l_quit End If // 分配空间 lbl_buffer = Blob ( Space ( ll_cbbuf ) ) li_rc = DocumentProperties ( 0, ll_handle, ls_DriverName, ref lbl_buffer, 0, DM_OUT_BUFFER ) CopyMem ( lstr_devmode, lbl_buffer, DEVMODE_LEN ) 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 li_rc = DocumentProperties ( 0, ll_handle, ls_DriverName, 0, lstr_devmode, DM_IN_BUFFER + DM_OUT_DEFAULT ) If li_rc > 0 Then li_rc = 1 l_quit: ClosePrinter ( ll_handle ) Return li_rc end function public function string of_getdrivername (string PrinterName);// 取打印机驱动程序名称 String ls_Driver Integer li_1, li_2, li_3, li_rc Any la_para li_rc = of_Printer ( PrinterName, 1, la_para, li_1, li_2, li_3 ) If li_rc = 1 Then ls_Driver = String ( la_para ) Else ls_Driver = '' End If Return ls_Driver end function public function string of_getportname (string printername);// 取打印机端口名称 String ls_port Integer li_1, li_2, li_3, li_rc Any la_para li_rc = of_Printer ( PrinterName, 2, la_para, li_1, li_2, li_3 ) If li_rc = 1 Then ls_port = String ( la_para ) Else ls_port = '' End If Return ls_port end function public function int of_getattribute (string printername);// 取打印机属性,下为打印机属性定义 /* #define PRINTER_ATTRIBUTE_QUEUED 0x00000001 #define PRINTER_ATTRIBUTE_DIRECT 0x00000002 #define PRINTER_ATTRIBUTE_DEFAULT 0x00000004 #define PRINTER_ATTRIBUTE_SHARED 0x00000008 #define PRINTER_ATTRIBUTE_NETWORK 0x00000010 #define PRINTER_ATTRIBUTE_HIDDEN 0x00000020 #define PRINTER_ATTRIBUTE_LOCAL 0x00000040 #define PRINTER_ATTRIBUTE_ENABLE_DEVQ 0x00000080 #define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS 0x00000100 #define PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST 0x00000200 #define PRINTER_ATTRIBUTE_WORK_OFFLINE 0x00000400 #define PRINTER_ATTRIBUTE_ENABLE_BIDI 0x00000800 #define PRINTER_ATTRIBUTE_RAW_ONLY 0x00001000 #define PRINTER_ATTRIBUTE_PUBLISHED 0x00002000 */ int li_attrib Integer li_1, li_2, li_3, li_rc Any la_para li_rc = of_Printer ( PrinterName, 2, la_para, li_1, li_2, li_3 ) If li_rc = 1 Then li_attrib = la_para Else li_attrib = -1 End If Return li_attrib end function public function long of_getstatus (string printername);// 取打印机状态,下为打印机状态定义 /* #define PRINTER_STATUS_PAUSED 0x00000001 #define PRINTER_STATUS_ERROR 0x00000002 #define PRINTER_STATUS_PENDING_DELETION 0x00000004 #define PRINTER_STATUS_PAPER_JAM 0x00000008 #define PRINTER_STATUS_PAPER_OUT 0x00000010 #define PRINTER_STATUS_MANUAL_FEED 0x00000020 #define PRINTER_STATUS_PAPER_PROBLEM 0x00000040 #define PRINTER_STATUS_OFFLINE 0x00000080 #define PRINTER_STATUS_IO_ACTIVE 0x00000100 #define PRINTER_STATUS_BUSY 0x00000200 #define PRINTER_STATUS_PRINTING 0x00000400 #define PRINTER_STATUS_OUTPUT_BIN_FULL 0x00000800 #define PRINTER_STATUS_NOT_AVAILABLE 0x00001000 #define PRINTER_STATUS_WAITING 0x00002000 #define PRINTER_STATUS_PROCESSING 0x00004000 #define PRINTER_STATUS_INITIALIZING 0x00008000 #define PRINTER_STATUS_WARMING_UP 0x00010000 #define PRINTER_STATUS_TONER_LOW 0x00020000 #define PRINTER_STATUS_NO_TONER 0x00040000 #define PRINTER_STATUS_PAGE_PUNT 0x00080000 #define PRINTER_STATUS_USER_INTERVENTION 0x00100000 #define PRINTER_STATUS_OUT_OF_MEMORY 0x00200000 #define PRINTER_STATUS_DOOR_OPEN 0x00400000 #define PRINTER_STATUS_SERVER_UNKNOWN 0x00800000 #define PRINTER_STATUS_POWER_SAVE 0x01000000 */ long ll_status Integer li_1, li_2, li_3, li_rc Any la_para li_rc = of_Printer ( PrinterName, 3, la_para, li_1, li_2, li_3 ) If li_rc = 1 Then ll_status = la_para Else ll_status = -1 End If Return ll_status end function public function integer of_getpapersize (string printername, ref integer papersize, ref integer paperwidth, ref integer paperheight);// 取打印机纸张大小 /* 打印机尺寸定义 #define DMPAPER_LETTER 1 /* Letter 8 1/2 x 11 in */ #define DMPAPER_LETTERSMALL 2 /* Letter Small 8 1/2 x 11 in */ #define DMPAPER_TABLOID 3 /* Tabloid 11 x 17 in */ #define DMPAPER_LEDGER 4 /* Ledger 17 x 11 in */ #define DMPAPER_LEGAL 5 /* Legal 8 1/2 x 14 in */ #define DMPAPER_STATEMENT 6 /* Statement 5 1/2 x 8 1/2 in */ #define DMPAPER_EXECUTIVE 7 /* Executive 7 1/4 x 10 1/2 in */ #define DMPAPER_A3 8 /* A3 297 x 420 mm */ #define DMPAPER_A4 9 /* A4 210 x 297 mm */ #define DMPAPER_A4SMALL 10 /* A4 Small 210 x 297 mm */ #define DMPAPER_A5 11 /* A5 148 x 210 mm */ #define DMPAPER_B4 12 /* B4 (JIS) 250 x 354 */ #define DMPAPER_B5 13 /* B5 (JIS) 182 x 257 mm */ #define DMPAPER_FOLIO 14 /* Folio 8 1/2 x 13 in */ #define DMPAPER_QUARTO 15 /* Quarto 215 x 275 mm */ #define DMPAPER_10X14 16 /* 10x14 in */ #define DMPAPER_11X17 17 /* 11x17 in */ #define DMPAPER_NOTE 18 /* Note 8 1/2 x 11 in */ #define DMPAPER_ENV_9 19 /* Envelope #9 3 7/8 x 8 7/8 */ #define DMPAPER_ENV_10 20 /* Envelope #10 4 1/8 x 9 1/2 */ #define DMPAPER_ENV_11 21 /* Envelope #11 4 1/2 x 10 3/8 */ #define DMPAPER_ENV_12 22 /* Envelope #12 4 \276 x 11 */ #define DMPAPER_ENV_14 23 /* Envelope #14 5 x 11 1/2 */ #define DMPAPER_CSHEET 24 /* C size sheet */ #define DMPAPER_DSHEET 25 /* D size sheet */ #define DMPAPER_ESHEET 26 /* E size sheet */ #define DMPAPER_ENV_DL 27 /* Envelope DL 110 x 220mm */ #define DMPAPER_ENV_C5 28 /* Envelope C5 162 x 229 mm */ #define DMPAPER_ENV_C3 29 /* Envelope C3 324 x 458 mm */ #define DMPAPER_ENV_C4 30 /* Envelope C4 229 x 324 mm */ #define DMPAPER_ENV_C6 31 /* Envelope C6 114 x 162 mm */ #define DMPAPER_ENV_C65 32 /* Envelope C65 114 x 229 mm */ #define DMPAPER_ENV_B4 33 /* Envelope B4 250 x 353 mm */ #define DMPAPER_ENV_B5 34 /* Envelope B5 176 x 250 mm */ #define DMPAPER_ENV_B6 35 /* Envelope B6 176 x 125 mm */ #define DMPAPER_ENV_ITALY 36 /* Envelope 110 x 230 mm */ #define DMPAPER_ENV_MONARCH 37 /* Envelope Monarch 3.875 x 7.5 in */ #define DMPAPER_ENV_PERSONAL 38 /* 6 3/4 Envelope 3 5/8 x 6 1/2 in */ #define DMPAPER_FANFOLD_US 39 /* US Std Fanfold 14 7/8 x 11 in */ #define DMPAPER_FANFOLD_STD_GERMAN 40 /* German Std Fanfold 8 1/2 x 12 in */ #define DMPAPER_FANFOLD_LGL_GERMAN 41 /* German Legal Fanfold 8 1/2 x 13 in */ #if(WINVER >= 0x0400) #define DMPAPER_ISO_B4 42 /* B4 (ISO) 250 x 353 mm */ #define DMPAPER_JAPANESE_POSTCARD 43 /* Japanese Postcard 100 x 148 mm */ #define DMPAPER_9X11 44 /* 9 x 11 in */ #define DMPAPER_10X11 45 /* 10 x 11 in */ #define DMPAPER_15X11 46 /* 15 x 11 in */ #define DMPAPER_ENV_INVITE 47 /* Envelope Invite 220 x 220 mm */ #define DMPAPER_RESERVED_48 48 /* RESERVED--DO NOT USE */ #define DMPAPER_RESERVED_49 49 /* RESERVED--DO NOT USE */ #define DMPAPER_LETTER_EXTRA 50 /* Letter Extra 9 \275 x 12 in */ #define DMPAPER_LEGAL_EXTRA 51 /* Legal Extra 9 \275 x 15 in */ #define DMPAPER_TABLOID_EXTRA 52 /* Tabloid Extra 11.69 x 18 in */ #define DMPAPER_A4_EXTRA 53 /* A4 Extra 9.27 x 12.69 in */ #define DMPAPER_LETTER_TRANSVERSE 54 /* Letter Transverse 8 \275 x 11 in */ #define DMPAPER_A4_TRANSVERSE 55 /* A4 Transverse 210 x 297 mm */ #define DMPAPER_LETTER_EXTRA_TRANSVERSE 56 /* Letter Extra Transverse 9\275 x 12 in */ #define DMPAPER_A_PLUS 57 /* SuperA/SuperA/A4 227 x 356 mm */ #define DMPAPER_B_PLUS 58 /* SuperB/SuperB/A3 305 x 487 mm */ #define DMPAPER_LETTER_PLUS 59 /* Letter Plus 8.5 x 12.69 in */ #define DMPAPER_A4_PLUS 60 /* A4 Plus 210 x 330 mm */ #define DMPAPER_A5_TRANSVERSE 61 /* A5 Transverse 148 x 210 mm */ #define DMPAPER_B5_TRANSVERSE 62 /* B5 (JIS) Transverse 182 x 257 mm */ #define DMPAPER_A3_EXTRA 63 /* A3 Extra 322 x 445 mm */ #define DMPAPER_A5_EXTRA 64 /* A5 Extra 174 x 235 mm */ #define DMPAPER_B5_EXTRA 65 /* B5 (ISO) Extra 201 x 276 mm */ #define DMPAPER_A2 66 /* A2 420 x 594 mm */ #define DMPAPER_A3_TRANSVERSE 67 /* A3 Transverse 297 x 420 mm */ #define DMPAPER_A3_EXTRA_TRANSVERSE 68 /* A3 Extra Transverse 322 x 445 mm */ #endif /* WINVER >= 0x0400 */ #if(WINVER >= 0x0500) #define DMPAPER_DBL_JAPANESE_POSTCARD 69 /* Japanese Double Postcard 200 x 148 mm */ #define DMPAPER_A6 70 /* A6 105 x 148 mm */ #define DMPAPER_JENV_KAKU2 71 /* Japanese Envelope Kaku #2 */ #define DMPAPER_JENV_KAKU3 72 /* Japanese Envelope Kaku #3 */ #define DMPAPER_JENV_CHOU3 73 /* Japanese Envelope Chou #3 */ #define DMPAPER_JENV_CHOU4 74 /* Japanese Envelope Chou #4 */ #define DMPAPER_LETTER_ROTATED 75 /* Letter Rotated 11 x 8 1/2 11 in */ #define DMPAPER_A3_ROTATED 76 /* A3 Rotated 420 x 297 mm */ #define DMPAPER_A4_ROTATED 77 /* A4 Rotated 297 x 210 mm */ #define DMPAPER_A5_ROTATED 78 /* A5 Rotated 210 x 148 mm */ #define DMPAPER_B4_JIS_ROTATED 79 /* B4 (JIS) Rotated 364 x 257 mm */ #define DMPAPER_B5_JIS_ROTATED 80 /* B5 (JIS) Rotated 257 x 182 mm */ #define DMPAPER_JAPANESE_POSTCARD_ROTATED 81 /* Japanese Postcard Rotated 148 x 100 mm */ #define DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED 82 /* Double Japanese Postcard Rotated 148 x 200 mm */ #define DMPAPER_A6_ROTATED 83 /* A6 Rotated 148 x 105 mm */ #define DMPAPER_JENV_KAKU2_ROTATED 84 /* Japanese Envelope Kaku #2 Rotated */ #define DMPAPER_JENV_KAKU3_ROTATED 85 /* Japanese Envelope Kaku #3 Rotated */ #define DMPAPER_JENV_CHOU3_ROTATED 86 /* Japanese Envelope Chou #3 Rotated */ #define DMPAPER_JENV_CHOU4_ROTATED 87 /* Japanese Envelope Chou #4 Rotated */ #define DMPAPER_B6_JIS 88 /* B6 (JIS) 128 x 182 mm */ #define DMPAPER_B6_JIS_ROTATED 89 /* B6 (JIS) Rotated 182 x 128 mm */ #define DMPAPER_12X11 90 /* 12 x 11 in */ #define DMPAPER_JENV_YOU4 91 /* Japanese Envelope You #4 */ #define DMPAPER_JENV_YOU4_ROTATED 92 /* Japanese Envelope You #4 Rotated*/ #define DMPAPER_P16K 93 /* PRC 16K 146 x 215 mm */ #define DMPAPER_P32K 94 /* PRC 32K 97 x 151 mm */ #define DMPAPER_P32KBIG 95 /* PRC 32K(Big) 97 x 151 mm */ #define DMPAPER_PENV_1 96 /* PRC Envelope #1 102 x 165 mm */ #define DMPAPER_PENV_2 97 /* PRC Envelope #2 102 x 176 mm */ #define DMPAPER_PENV_3 98 /* PRC Envelope #3 125 x 176 mm */ #define DMPAPER_PENV_4 99 /* PRC Envelope #4 110 x 208 mm */ #define DMPAPER_PENV_5 100 /* PRC Envelope #5 110 x 220 mm */ #define DMPAPER_PENV_6 101 /* PRC Envelope #6 120 x 230 mm */ #define DMPAPER_PENV_7 102 /* PRC Envelope #7 160 x 230 mm */ #define DMPAPER_PENV_8 103 /* PRC Envelope #8 120 x 309 mm */ #define DMPAPER_PENV_9 104 /* PRC Envelope #9 229 x 324 mm */ #define DMPAPER_PENV_10 105 /* PRC Envelope #10 324 x 458 mm */ #define DMPAPER_P16K_ROTATED 106 /* PRC 16K Rotated */ #define DMPAPER_P32K_ROTATED 107 /* PRC 32K Rotated */ #define DMPAPER_P32KBIG_ROTATED 108 /* PRC 32K(Big) Rotated */ #define DMPAPER_PENV_1_ROTATED 109 /* PRC Envelope #1 Rotated 165 x 102 mm */ #define DMPAPER_PENV_2_ROTATED 110 /* PRC Envelope #2 Rotated 176 x 102 mm */ #define DMPAPER_PENV_3_ROTATED 111 /* PRC Envelope #3 Rotated 176 x 125 mm */ #define DMPAPER_PENV_4_ROTATED 112 /* PRC Envelope #4 Rotated 208 x 110 mm */ #define DMPAPER_PENV_5_ROTATED 113 /* PRC Envelope #5 Rotated 220 x 110 mm */ #define DMPAPER_PENV_6_ROTATED 114 /* PRC Envelope #6 Rotated 230 x 120 mm */ #define DMPAPER_PENV_7_ROTATED 115 /* PRC Envelope #7 Rotated 230 x 160 mm */ #define DMPAPER_PENV_8_ROTATED 116 /* PRC Envelope #8 Rotated 309 x 120 mm */ #define DMPAPER_PENV_9_ROTATED 117 /* PRC Envelope #9 Rotated 324 x 229 mm */ #define DMPAPER_PENV_10_ROTATED 118 /* PRC Envelope #10 Rotated 458 x 324 mm */ #endif /* WINVER >= 0x0500 */ #if (WINVER >= 0x0500) #define DMPAPER_LAST DMPAPER_PENV_10_ROTATED #elif (WINVER >= 0x0400) #define DMPAPER_LAST DMPAPER_A3_EXTRA_TRANSVERSE #else #define DMPAPER_LAST DMPAPER_FANFOLD_LGL_GERMAN #endif #define DMPAPER_USER 256 */ Integer li_rc any la_buff Return of_Printer ( printername, 5, la_buff, papersize,paperwidth,paperheight ) end function public function string of_getpbprinter ();String ls_printer Integer li_Pos ls_printer = ProfileString ( "win.ini", "windows", "device", "" ) //messagebox('',ls_printer) //setProfileString ( "win.ini", "windows", "device", "HP LaserJet 5L" ) //ls_printer = ProfileString ( "win.ini", "windows", "device", "" ) // //messagebox('',ls_printer) 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 ) // // string ls_s ls_s=f_ProfileString (sys_empid,"devices", printername, 'winspool,') f_SetProfileString (sys_empid,"windows", "device", printername+','+ls_s) Return 1 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 Return ls_target end function private function integer of_modifyprinter (string printername, str_devmode devmode);// 修改打印机参数 // 仅供内部使用 // 与打印机有关的操作 // return 1: 成功 // return -1: 不成功 str_Printer_info_2 lstr_info str_Printer_defaults lstr_default str_devmode lstr_devmode Integer li_rc, li_i string ls_DriverName, ls_PortName ulong ll_handle, ll_cbbuf, ll_cbNeeded blob lbl_buffer // 打开打印机 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 // copy 至结构 CopyMem ( lstr_info, lbl_buffer, PRINTER_INFO_2_LEN ) // 驱动名、端口 ls_DriverName = String ( lstr_info.DriverName, "address" ) ls_PortName = String ( lstr_info.PortName, "address" ) // 设置更新所有属性 devMode.dmFields = 536870911 li_rc = DocumentProperties ( 0, ll_handle, ls_DriverName, 0, devmode, DM_IN_BUFFER + DM_OUT_DEFAULT ) If li_rc > 0 Then li_rc = 1 l_quit: ClosePrinter ( ll_handle ) Return li_rc end function public function integer of_printsetup (unsignedlong hwnd);str_PrintDlg lstr_Dlg str_devmode lstr_devmode str_devnames lstr_devNames String ls_printer, ls_driver, ls_port, ls_char Blob lbl_buffer ulong ll_mem, ll_length // 初始化结构参数 lstr_Dlg.lStructSize = PRINTDLG_LEN lstr_Dlg.hwndOwner = hwnd lstr_Dlg.hDevMode = 0 lstr_Dlg.hDevNames = 0 lstr_Dlg.flags = PD_PRINTTOFILE + PD_NOPAGENUMS + PD_NOSELECTION + PD_USEDEVMODECOPIESANDCOLLATE lstr_Dlg.hInstance = 0 lstr_Dlg.lCustData = 0 lstr_Dlg.lpfnPrintHook = 0 lstr_Dlg.lpfnSetupHook = 0 lstr_Dlg.lpPrintTemplateName = 0 lstr_Dlg.lpSetupTemplateName = 0 lstr_Dlg.hPrintTemplate = 0 lstr_Dlg.hSetupTemplate = 0 If PrintDlg ( lstr_Dlg ) <> 0 Then // 取devmode ll_mem = GlobalLock ( lstr_Dlg.hDevMode ) CopyMem ( lstr_devmode, ll_mem, DEVMODE_LEN ) GlobalUnlock ( lstr_Dlg.hDevMode ) // 取devnames // 这个结构记录用户设置的打印机 // 取长度 ll_Length = GlobalSize ( lstr_Dlg.hDevNames ) ll_mem = GlobalLock ( lstr_Dlg.hDevNames ) CopyMem ( lstr_devNames, ll_mem, DEVNAMES_LEN ) // 分配空间 lbl_buffer = Blob ( Space ( ll_length ) ) CopyMem ( lbl_buffer, ll_mem, ll_length ) GlobalUnlock ( lstr_Dlg.hDevNames ) // 打印机名称 ls_printer = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wDeviceOffset + 1 ) // 驱动程序,可能是以前的16位系统留下的东西吧? ls_driver = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wDriverOffset + 1 ) // 打印端口 ls_port = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wOutputOffset + 1 ) // 更新打印机属性 of_ModifyPrinter ( ls_printer, lstr_devMode ) // 将打印机设置为缺省打印机 of_SetDefault ( ls_printer ) Else Return -1 End If Return 1 end function public function integer of_setpapersize (string printername, integer papersize, integer paperwidth, integer paperheight);any la_any Return of_Printer( printername, 101, la_any, papersize,paperwidth,paperheight ) end function public function integer of_pagesetup (unsignedlong hwnd, ref long left, ref long right, ref long top, ref long bottom);// 打印机页面设置 // 返回1:用户选择确定 // 左右上下边界放在left, right,top,bottom中返回 str_PageSetupDlg lstr_Dlg str_devmode lstr_devmode str_devnames lstr_devNames String ls_printer, ls_driver, ls_port, ls_char Blob lbl_buffer ulong ll_mem, ll_length // 初始化结构参数 lstr_Dlg.lStructSize = PAGESETUPDLG_LEN lstr_Dlg.hwndOwner = hwnd lstr_Dlg.hDevMode = 0 lstr_Dlg.hDevNames = 0 lstr_Dlg.flags = PSD_DEFAULTMINMARGINS + PSD_INHUNDREDTHSOFMILLIMETERS lstr_Dlg.hInstance = 0 lstr_Dlg.lCustData = 0 If PageSetupDlg ( lstr_Dlg ) Then // 取devmode ll_mem = GlobalLock ( lstr_Dlg.hDevMode ) CopyMem ( lstr_devmode, ll_mem, DEVMODE_LEN ) GlobalUnlock ( lstr_Dlg.hDevMode ) // 取devnames // 这个结构记录用户设置的打印机 // 取长度 ll_Length = GlobalSize ( lstr_Dlg.hDevNames ) ll_mem = GlobalLock ( lstr_Dlg.hDevNames ) CopyMem ( lstr_devNames, ll_mem, DEVNAMES_LEN ) // 分配空间 lbl_buffer = Blob ( Space ( ll_length ) ) CopyMem ( lbl_buffer, ll_mem, ll_length ) GlobalUnlock ( lstr_Dlg.hDevNames ) // 打印机名称 ls_printer = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wDeviceOffset + 1 ) // 驱动程序,可能是以前的16位系统留下的东西吧? ls_driver = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wDriverOffset + 1 ) // 打印端口 ls_port = of_GetStringFromBlob ( lbl_buffer, lstr_devNames.wOutputOffset + 1 ) // 更新打印机属性 of_ModifyPrinter ( ls_printer, lstr_devMode ) // 将打印机设置为缺省打印机 of_SetDefault ( ls_printer ) 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 on uo_rpt_printer_setting.create call super::create TriggerEvent( this, "constructor" ) end on on uo_rpt_printer_setting.destroy TriggerEvent( this, "destructor" ) call super::destroy end on event constructor;//// 形成打印机列表 //String ls_list [ ] //String ls_driver, ls_port, ls_PBPrinter //Integer li_i, li_count, li_size, li_width, li_length, li_row //datawindow ldw_list //ldw_list = tab_1.tabpage_1.dw_list // //// 取打印机列表 //li_count = lnv_printer.of_GetPrinterList ( ls_list ) // //// 取PB缺省打印机 //ls_PBPrinter = lnv_printer.of_GetPBPrinter ( ) // //// 清除数据 //li_row = ldw_list.GetRow ( ) // //ldw_list.SetRedraw ( False ) //ldw_list.Reset ( ) //For li_i = 1 To li_count // ldw_list.InsertRow ( 0 ) // ldw_list.Setitem ( li_i, "printername", ls_list [ li_i ] ) // ls_driver = lnv_printer.of_GetDriverName ( ls_list [ li_i ] ) // ls_port = lnv_printer.of_GetPortName ( ls_list [ li_i ] ) // ldw_list.setitem ( li_i, "drivername", ls_driver ) // ldw_list.setitem ( li_i, "portname", ls_port ) // // If ls_PBPrinter = ls_list [ li_i ] Then // ldw_list.Setitem ( li_i, "pbdefault", 1 ) // End If // // // 取打印纸大小 // lnv_printer.of_GetPaperSize ( ls_list [ li_i ], li_size, li_width, li_length ) // ldw_list.Setitem ( li_i, "papersize", li_size ) // ldw_list.Setitem ( li_i, "paperwidth", li_width ) // ldw_list.Setitem ( li_i, "paperheight", li_length ) //Next // //If li_row <> 0 Then // ldw_list.ScrollToRow ( li_row ) //End If // //ldw_list.setRedraw ( True ) //Return 1 end event