Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
DocumentProperties anyone?
Message
From
06/05/2005 00:05:31
 
General information
Forum:
Visual FoxPro
Category:
Windows API functions
Environment versions
Visual FoxPro:
VFP 9
Miscellaneous
Thread ID:
01010251
Message ID:
01011495
Views:
21
Hello Barbara,

i've finally managed it to work, but you'll need an external FLL which i've written.
If you are interested in the FLL post back .. it's not released yet .. so you would be my first beta tester :) .
But since i've tested the lib myself for several month now i can say that it is very stable if used correctly.
Since if gives you the power a handling pointers one can of course also produce C005 errors .. but that is true for C aswell - power/freedom goes hand in hand with responsibility!
&& !! 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

ENDDEFINE
Regards
Christian
Previous
Reply
Map
View

Click here to load this message in the networking platform