&& !! Error handling completely ommitted !! PRIVATE hWindow, hPrinter, nBufsize, cPrinter, lnRet, loDevDefault, loDevChanged, loPrinterInfo #DEFINE IDOK 1 #DEFINE IDCANCEL 2 #DEFINE CRLF Chr(13) + Chr(10) #DEFINE DM_OUT_BUFFER 2 #DEFINE DM_IN_BUFFER 8 #DEFINE DM_IN_PROMPT 4 If !("vfp2c32" $ Set("Library")) Set Library To vfp2c32.fll ADDITIVE IF !InitVFP2CLibrary(0xFFFFFFFF) LOCAL laError[1] AErrorEx('laError') && error handler of the lib .. MESSAGEBOX('VFP2C32 Library initialization failed:' + CRLF + ; 'Error No: ' + TRANSFORM(laError[1]) + CRLF + ; 'Function: ' + laError[2] + CRLF + ; "Message: '" + laError[3] + '"',48,'Error') RETURN ENDIF DECLARE INTEGER OpenPrinter IN winspool.drv STRING pPrinterName, INTEGER @phPrinter, INTEGER pDefault Declare INTEGER ClosePrinter IN winspool.drv INTEGER Declare INTEGEr GetPrinter in winspool.drv AS GetPrinterEx INTEGER, INTEGER, INTEGER, INTEGER, INTEGER @ Declare INTEGER SetPrinter IN winspool.drv INTEGER, INTEGER, INTEGER, INTEGER DECLARE INTEGER GetActiveWindow IN user32.dll DECLARE INTEGER GetLastError IN kernel32.dll DECLARE INTEGER DocumentProperties IN winspool.drv; INTEGER hWnd, INTEGER hPrinter, STRING pDeviceName,; INTEGER pDevModeOutput, INTEGER pDevModeInput, INTEGER fMode cPrinter = GETPRINTER() hWindow = GetActiveWindow() hPrinter = 0 OpenPrinter(cPrinter, @hPrinter, 0) IF hPrinter = 0 Messagebox("Could not open default printer.", 48, "Error") RETURN ENDIF * being called this way the function returns DEVMODE buffer required size nBufsize = DocumentProperties(hWindow, hPrinter, cPrinter,0,0,0) loDevDefault = CreateObject('DEVMODE',nBufSize) loDevChanged = CreateObject('DEVMODE',nBufSize) * reading printer configuration lnRet = DocumentProperties(hWindow, hPrinter, cPrinter, loDevDefault.Address, 0, DM_OUT_BUFFER) * Show printer settings dialog. lnRet = DocumentProperties(hWindow, hPrinter, cPrinter, loDevChanged.Address, loDevDefault.Address, DM_IN_PROMPT+DM_IN_BUFFER+DM_OUT_BUFFER) If .T. && IF WinNT/2000 or later .. nBufSize = 0 GetPrinterEx(hPrinter,2,0,0,@nBufSize) loPrinterInfo = CreateObject('PRINTER_INFO_2',nBufSize) GetPrinterEx(hPrinter,2,loPrinterInfo.Address,nBufSize,@nBufSize) loPrinterInfo.pDevMode = loDevChanged.Address SetPrinter(hPrinter,2,loPrinterInfo.Address,0) Else && win95/98/Me && trusting Amyuni's code here (not checked since i don't have a machine with Win95/98/Me on it) DocumentProperties(0, hPrinter,cPrinter,0,loDevChanged.Address,DM_IN_BUFFER+DM_OUT_BUFFER) EndIf ClosePrinter(hPrinter) && we don't want to leak printer handles! Set Printer to default && force VFP to reread settings SET PRINTER TO NAME (cPrinter) && run report here ... && structure wrapper classes automatically produced by VFP2C32 Struct Translator (and some minimal manual fixup) DEFINE CLASS DEVMODE AS Exception Address = 0 SizeOf = 156 Name = "DEVMODE" && structure fields dmDeviceName = .F. dmSpecVersion = .F. dmDriverVersion = .F. dmSize = .F. dmDriverExtra = .F. dmFields = .F. dmOrientation = .F. dmPaperSize = .F. dmPaperLength = .F. dmPaperWidth = .F. dmScale = .F. dmCopies = .F. dmDefaultSource = .F. dmPrintQuality = .F. dmPosition = .NULL. dmDisplayOrientation = .F. dmDisplayFixedOutput = .F. dmColor = .F. dmDuplex = .F. dmYResolution = .F. dmTTOption = .F. dmCollate = .F. dmFormName = .F. dmLogPixels = .F. dmBitsPerPel = .F. dmPelsWidth = .F. dmPelsHeight = .F. dmDisplayFlags = .F. dmNup = .F. dmDisplayFrequency = .F. dmICMMethod = .F. dmICMIntent = .F. dmMediaType = .F. dmDitherType = .F. dmReserved1 = .F. dmReserved2 = .F. dmPanningWidth = .F. dmPanningHeight = .F. PROCEDURE Init(lnBufferSize) THIS.Address = AllocMem(lnBufferSize) IF THIS.Address = 0 ERROR(43) RETURN .F. ENDIF THIS.dmPosition = CREATEOBJECT('POINT',THIS.Address+44) ENDPROC PROCEDURE Destroy() THIS.dmPosition = .NULL. FreeMem(THIS.Address) ENDPROC PROCEDURE Address_Assign(lnAddress) DO CASE CASE THIS.Address = 0 THIS.Address = lnAddress CASE THIS.Address = lnAddress OTHERWISE THIS.Address = lnAddress THIS.dmPosition.Address = lnAddress+44 ENDCASE ENDPROC PROCEDURE dmDeviceName_Access() RETURN ReadCharArray(THIS.Address,32) ENDPROC PROCEDURE dmDeviceName_Assign(lnNewVal) WriteCharArray(THIS.Address,lnNewVal,32) ENDPROC PROCEDURE dmSpecVersion_Access() RETURN ReadUShort(THIS.Address+32) ENDPROC PROCEDURE dmSpecVersion_Assign(lnNewVal) WriteUShort(THIS.Address+32,lnNewVal) ENDPROC PROCEDURE dmDriverVersion_Access() RETURN ReadUShort(THIS.Address+34) ENDPROC PROCEDURE dmDriverVersion_Assign(lnNewVal) WriteUShort(THIS.Address+34,lnNewVal) ENDPROC PROCEDURE dmSize_Access() RETURN ReadUShort(THIS.Address+36) ENDPROC PROCEDURE dmSize_Assign(lnNewVal) WriteUShort(THIS.Address+36,lnNewVal) ENDPROC PROCEDURE dmDriverExtra_Access() RETURN ReadUShort(THIS.Address+38) ENDPROC PROCEDURE dmDriverExtra_Assign(lnNewVal) WriteUShort(THIS.Address+38,lnNewVal) ENDPROC PROCEDURE dmFields_Access() RETURN ReadUInt(THIS.Address+40) ENDPROC PROCEDURE dmFields_Assign(lnNewVal) WriteUInt(THIS.Address+40,lnNewVal) ENDPROC PROCEDURE dmOrientation_Access() RETURN ReadShort(THIS.Address+44) ENDPROC PROCEDURE dmOrientation_Assign(lnNewVal) WriteShort(THIS.Address+44,lnNewVal) ENDPROC PROCEDURE dmPaperSize_Access() RETURN ReadShort(THIS.Address+46) ENDPROC PROCEDURE dmPaperSize_Assign(lnNewVal) WriteShort(THIS.Address+46,lnNewVal) ENDPROC PROCEDURE dmPaperLength_Access() RETURN ReadShort(THIS.Address+48) ENDPROC PROCEDURE dmPaperLength_Assign(lnNewVal) WriteShort(THIS.Address+48,lnNewVal) ENDPROC PROCEDURE dmPaperWidth_Access() RETURN ReadShort(THIS.Address+50) ENDPROC PROCEDURE dmPaperWidth_Assign(lnNewVal) WriteShort(THIS.Address+50,lnNewVal) ENDPROC PROCEDURE dmScale_Access() RETURN ReadShort(THIS.Address+52) ENDPROC PROCEDURE dmScale_Assign(lnNewVal) WriteShort(THIS.Address+52,lnNewVal) ENDPROC PROCEDURE dmCopies_Access() RETURN ReadShort(THIS.Address+54) ENDPROC PROCEDURE dmCopies_Assign(lnNewVal) WriteShort(THIS.Address+54,lnNewVal) ENDPROC PROCEDURE dmDefaultSource_Access() RETURN ReadShort(THIS.Address+56) ENDPROC PROCEDURE dmDefaultSource_Assign(lnNewVal) WriteShort(THIS.Address+56,lnNewVal) ENDPROC PROCEDURE dmPrintQuality_Access() RETURN ReadShort(THIS.Address+58) ENDPROC PROCEDURE dmPrintQuality_Assign(lnNewVal) WriteShort(THIS.Address+58,lnNewVal) ENDPROC PROCEDURE dmDisplayOrientation_Access() RETURN ReadUInt(THIS.Address+52) ENDPROC PROCEDURE dmDisplayOrientation_Assign(lnNewVal) WriteUInt(THIS.Address+52,lnNewVal) ENDPROC PROCEDURE dmDisplayFixedOutput_Access() RETURN ReadUInt(THIS.Address+56) ENDPROC PROCEDURE dmDisplayFixedOutput_Assign(lnNewVal) WriteUInt(THIS.Address+56,lnNewVal) ENDPROC PROCEDURE dmColor_Access() RETURN ReadShort(THIS.Address+60) ENDPROC PROCEDURE dmColor_Assign(lnNewVal) WriteShort(THIS.Address+60,lnNewVal) ENDPROC PROCEDURE dmDuplex_Access() RETURN ReadShort(THIS.Address+62) ENDPROC PROCEDURE dmDuplex_Assign(lnNewVal) WriteShort(THIS.Address+62,lnNewVal) ENDPROC PROCEDURE dmYResolution_Access() RETURN ReadShort(THIS.Address+64) ENDPROC PROCEDURE dmYResolution_Assign(lnNewVal) WriteShort(THIS.Address+64,lnNewVal) ENDPROC PROCEDURE dmTTOption_Access() RETURN ReadShort(THIS.Address+66) ENDPROC PROCEDURE dmTTOption_Assign(lnNewVal) WriteShort(THIS.Address+66,lnNewVal) ENDPROC PROCEDURE dmCollate_Access() RETURN ReadShort(THIS.Address+68) ENDPROC PROCEDURE dmCollate_Assign(lnNewVal) WriteShort(THIS.Address+68,lnNewVal) ENDPROC PROCEDURE dmFormName_Access() RETURN ReadCharArray(THIS.Address+70,32) ENDPROC PROCEDURE dmFormName_Assign(lnNewVal) WriteCharArray(THIS.Address+70,lnNewVal,32) ENDPROC PROCEDURE dmLogPixels_Access() RETURN ReadUShort(THIS.Address+102) ENDPROC PROCEDURE dmLogPixels_Assign(lnNewVal) WriteUShort(THIS.Address+102,lnNewVal) ENDPROC PROCEDURE dmBitsPerPel_Access() RETURN ReadUInt(THIS.Address+104) ENDPROC PROCEDURE dmBitsPerPel_Assign(lnNewVal) WriteUInt(THIS.Address+104,lnNewVal) ENDPROC PROCEDURE dmPelsWidth_Access() RETURN ReadUInt(THIS.Address+108) ENDPROC PROCEDURE dmPelsWidth_Assign(lnNewVal) WriteUInt(THIS.Address+108,lnNewVal) ENDPROC PROCEDURE dmPelsHeight_Access() RETURN ReadUInt(THIS.Address+112) ENDPROC PROCEDURE dmPelsHeight_Assign(lnNewVal) WriteUInt(THIS.Address+112,lnNewVal) ENDPROC PROCEDURE dmDisplayFlags_Access() RETURN ReadUInt(THIS.Address+116) ENDPROC PROCEDURE dmDisplayFlags_Assign(lnNewVal) WriteUInt(THIS.Address+116,lnNewVal) ENDPROC PROCEDURE dmNup_Access() RETURN ReadUInt(THIS.Address+116) ENDPROC PROCEDURE dmNup_Assign(lnNewVal) WriteUInt(THIS.Address+116,lnNewVal) ENDPROC PROCEDURE dmDisplayFrequency_Access() RETURN ReadUInt(THIS.Address+120) ENDPROC PROCEDURE dmDisplayFrequency_Assign(lnNewVal) WriteUInt(THIS.Address+120,lnNewVal) ENDPROC PROCEDURE dmICMMethod_Access() RETURN ReadUInt(THIS.Address+124) ENDPROC PROCEDURE dmICMMethod_Assign(lnNewVal) WriteUInt(THIS.Address+124,lnNewVal) ENDPROC PROCEDURE dmICMIntent_Access() RETURN ReadUInt(THIS.Address+128) ENDPROC PROCEDURE dmICMIntent_Assign(lnNewVal) WriteUInt(THIS.Address+128,lnNewVal) ENDPROC PROCEDURE dmMediaType_Access() RETURN ReadUInt(THIS.Address+132) ENDPROC PROCEDURE dmMediaType_Assign(lnNewVal) WriteUInt(THIS.Address+132,lnNewVal) ENDPROC PROCEDURE dmDitherType_Access() RETURN ReadUInt(THIS.Address+136) ENDPROC PROCEDURE dmDitherType_Assign(lnNewVal) WriteUInt(THIS.Address+136,lnNewVal) ENDPROC PROCEDURE dmReserved1_Access() RETURN ReadUInt(THIS.Address+140) ENDPROC PROCEDURE dmReserved1_Assign(lnNewVal) WriteUInt(THIS.Address+140,lnNewVal) ENDPROC PROCEDURE dmReserved2_Access() RETURN ReadUInt(THIS.Address+144) ENDPROC PROCEDURE dmReserved2_Assign(lnNewVal) WriteUInt(THIS.Address+144,lnNewVal) ENDPROC PROCEDURE dmPanningWidth_Access() RETURN ReadUInt(THIS.Address+148) ENDPROC PROCEDURE dmPanningWidth_Assign(lnNewVal) WriteUInt(THIS.Address+148,lnNewVal) ENDPROC PROCEDURE dmPanningHeight_Access() RETURN ReadUInt(THIS.Address+152) ENDPROC PROCEDURE dmPanningHeight_Assign(lnNewVal) WriteUInt(THIS.Address+152,lnNewVal) ENDPROC ENDDEFINE DEFINE CLASS PRINTER_INFO_2 AS Exception Address = 0 SizeOf = 84 Name = "PRINTER_INFO_2" && structure fields pServerName = .F. pPrinterName = .F. pShareName = .F. pPortName = .F. pDriverName = .F. pComment = .F. pLocation = .F. pDevMode = .F. pSepFile = .F. pPrintProcessor = .F. pDatatype = .F. pParameters = .F. pSecurityDescriptor = .F. Attributes = .F. Priority = .F. DefaultPriority = .F. StartTime = .F. UntilTime = .F. Status = .F. cJobs = .F. AveragePPM = .F. PROCEDURE Init(lnBufferSize) THIS.Address = AllocMem(lnBufferSize) IF THIS.Address = 0 ERROR(43) RETURN .F. ENDIF ENDPROC PROCEDURE Destroy() FreeMem(THIS.Address) ENDPROC PROCEDURE pServerName_Access() RETURN ReadPCString(THIS.Address) ENDPROC PROCEDURE pPrinterName_Access() RETURN ReadPCString(THIS.Address+4) ENDPROC PROCEDURE pShareName_Access() RETURN ReadPCString(THIS.Address+8) ENDPROC PROCEDURE pPortName_Access() RETURN ReadPCString(THIS.Address+12) ENDPROC PROCEDURE pDriverName_Access() RETURN ReadPCString(THIS.Address+16) ENDPROC PROCEDURE pComment_Access() RETURN ReadPCString(THIS.Address+20) ENDPROC PROCEDURE pLocation_Access() RETURN ReadPCString(THIS.Address+24) ENDPROC PROCEDURE pDevMode_Access() RETURN ReadPointer(THIS.Address+28) ENDPROC PROCEDURE pDevMode_Assign(lnNewVal) WritePointer(THIS.Address+28,lnNewVal) ENDPROC PROCEDURE pSepFile_Access() RETURN ReadPCString(THIS.Address+32) ENDPROC PROCEDURE pPrintProcessor_Access() RETURN ReadPCString(THIS.Address+36) ENDPROC PROCEDURE pDatatype_Access() RETURN ReadPCString(THIS.Address+40) ENDPROC PROCEDURE pParameters_Access() RETURN ReadPCString(THIS.Address+44) ENDPROC PROCEDURE pSecurityDescriptor_Access() RETURN ReadPointer(THIS.Address+48) ENDPROC PROCEDURE pSecurityDescriptor_Assign(lnNewVal) WritePointer(THIS.Address+48,lnNewVal) ENDPROC PROCEDURE Attributes_Access() RETURN ReadUInt(THIS.Address+52) ENDPROC PROCEDURE Attributes_Assign(lnNewVal) WriteUInt(THIS.Address+52,lnNewVal) ENDPROC PROCEDURE Priority_Access() RETURN ReadUInt(THIS.Address+56) ENDPROC PROCEDURE Priority_Assign(lnNewVal) WriteUInt(THIS.Address+56,lnNewVal) ENDPROC PROCEDURE DefaultPriority_Access() RETURN ReadUInt(THIS.Address+60) ENDPROC PROCEDURE DefaultPriority_Assign(lnNewVal) WriteUInt(THIS.Address+60,lnNewVal) ENDPROC PROCEDURE StartTime_Access() RETURN ReadUInt(THIS.Address+64) ENDPROC PROCEDURE StartTime_Assign(lnNewVal) WriteUInt(THIS.Address+64,lnNewVal) ENDPROC PROCEDURE UntilTime_Access() RETURN ReadUInt(THIS.Address+68) ENDPROC PROCEDURE UntilTime_Assign(lnNewVal) WriteUInt(THIS.Address+68,lnNewVal) ENDPROC PROCEDURE Status_Access() RETURN ReadUInt(THIS.Address+72) ENDPROC PROCEDURE Status_Assign(lnNewVal) WriteUInt(THIS.Address+72,lnNewVal) ENDPROC PROCEDURE cJobs_Access() RETURN ReadUInt(THIS.Address+76) ENDPROC PROCEDURE cJobs_Assign(lnNewVal) WriteUInt(THIS.Address+76,lnNewVal) ENDPROC PROCEDURE AveragePPM_Access() RETURN ReadUInt(THIS.Address+80) ENDPROC PROCEDURE AveragePPM_Assign(lnNewVal) WriteUInt(THIS.Address+80,lnNewVal) ENDPROC ENDDEFINE DEFINE CLASS POINT AS Exception Address = 0 SizeOf = 8 PROTECTED Embedded Embedded = .F. && structure fields x = .F. y = .F. PROCEDURE Init(lnAddress) IF PCOUNT() = 0 THIS.Address = AllocMem(THIS.SizeOf) IF THIS.Address = 0 ERROR(43) RETURN .F. ENDIF ELSE ASSERT TYPE('lnAddress') = 'N' AND lnAddress != 0 MESSAGE 'Address of structure must be specified!' THIS.Address = lnAddress THIS.Embedded = .T. ENDIF ENDPROC PROCEDURE Destroy() IF !THIS.Embedded FreeMem(THIS.Address) ENDIF ENDPROC PROCEDURE x_Access() RETURN ReadInt(THIS.Address) ENDPROC PROCEDURE x_Assign(lnNewVal) WriteInt(THIS.Address,lnNewVal) ENDPROC PROCEDURE y_Access() RETURN ReadInt(THIS.Address+4) ENDPROC PROCEDURE y_Assign(lnNewVal) WriteInt(THIS.Address+4,lnNewVal) ENDPROC ENDDEFINERegards