PrinterSettings: impostare e ripristinare le impostationi tramite Geth...

domenica 26 febbraio 2006 - 11.42

lufra Profilo | Newbie

La mia necessità è quella di poter salvare le impostazioni della classe PrinterSettings in un file, quindi poter leggere e poi ricostruire la struttura DEVMODE che appunto contiene tutte le informazioni del device context, anche quelle avanzate.

La cosa mi sembrava alquanto semplice, utilizzare il metodo Gethdevmode per ottenere un System.Intptr che punta alla memoria contenente appunto i dati del DEVMODE, copiarli in una matrice di byte e metterla in un file. Per l’operazione inversa, leggere i dati dal file in una matrice di byte, allocare la quantità giusta di memoria tramite System.Runtime.InteropServices.Marshal.AllocHGlobal(size) che restituisce appunto un System.Intptr, copiarci dentro i dati della matrice utilizzando il metodo
System.Runtime.InteropServices.Marshal.Copy ed infine tramite il metodo Sethdevmode della classe PrinterSettings il gioco era fatto. Invece le impostazioni rimangono quelle predefinite.

Ho notato che la classe Marshal non espone alcun metodo per ricavare la dimensione della memoria a cui punta un System.Intptr, dato che il metodo SizeOf restituisce la dimensione dell’oggetto passato, 4 byte per un System.Intptr, così per recuperare la quantità di byte della memoria a cui si punta ho utilizzato la API di windows così definita:

<System.Runtime.InteropServices.DllImport("KERNEL32.DLL")> _
Public Function GlobalSize(ByVal hMem As System.IntPtr) As Integer

End Function

Ed effettivamente sembra che funzioni senza problemi. Devo dirle che con VB6, per la stampa risono sempre affidato alle api native di windows, visto le potenzialità offerte, ma con VB.NET mi sembra alquanto obsoleto dover ricorrere di nuovo a questo.

Di seguito la porzione di codice da me utilizzato che sembra proprio non funzionare:

‘Ripristino della struttura
Dim by As Byte() ‘Contiene i dati DEVMODE
Dim p As System.IntPtr
Dim m As System.Runtime.InteropServices.Marshal
Dim prtDialog As New System.Windows.Forms.PrintDialog

prtDialog.PrinterSettings = New System.Drawing.Printing.PrinterSettings
.............Legge I dati DEVMODE e li mette in by()
p = m.AllocHGlobal(by.Length)
m.Copy(by, 0, p, by.Length)
prtDialog.PrinterSettings.PrinterName = name
prtDialog.PrinterSettings.SetHdevmode(p)

‘Salvataggio della struttura
Dim by As Byte() ‘Contiene i dati DEVMODE
Dim p As System.IntPtr
Dim m As System.Runtime.InteropServices.Marshal
Dim prtDialog As New System.Windows.Forms.PrintDialog

prtDialog.PrinterSettings = New System.Drawing.Printing.PrinterSettings
prtDialog.ShowDialog()
p = prtDialog.PrinterSettings.GetHdevmode
Dim size As Integer = GlobalSize(p)
ReDim by(size - 1)
m.Copy(p, by, 0, size)
m.FreeHGlobal(p)

Ringraziando tutti in anticipo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5