Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
PrinterSettings: impostare e ripristinare le impostationi tramite Geth...
domenica 26 febbraio 2006 - 11.42
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
lufra
Profilo
| Newbie
1
messaggi | Data Invio:
dom 26 feb 2006 - 11:42
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
Torna su
Stanze Forum
Elenco Threads
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 !