Domanda

Ho un'applicazione WinForms che genera il proprio oggetto PrintDocument per la stampa. Funziona bene in XP e Windows 7 con mio test, ma un utente è stato sempre la seguente eccezione in Vista quando selezionano il comando di stampa con un documento aperto:

************** Exception Text **************
System.ArgumentException: Handle 0 is not valid.
   at System.Drawing.Printing.PrinterSettings.SetHdevmode(IntPtr hdevmode)
   at System.Windows.Forms.PrintDialog.UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, Int16 copies, Int32 flags, PrinterSettings settings, PageSettings pageSettings)
   at System.Windows.Forms.PrintDialog.ShowPrintDialog(IntPtr hwndOwner, WndProc hookProcPtr, PRINTDLG data)
   at System.Windows.Forms.PrintDialog.RunDialog(IntPtr hwndOwner)
   at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
   at System.Windows.Forms.CommonDialog.ShowDialog()
   at Deck_Studio.DSMain.PrintDeck(Object sender, EventArgs e)
   at System.Windows.Forms.MenuItem.OnClick(EventArgs e)
   at System.Windows.Forms.MenuItem.MenuItemData.Execute()
   at System.Windows.Forms.Command.Invoke()
   at System.Windows.Forms.Command.DispatchID(Int32 id)
   at System.Windows.Forms.Control.WmCommand(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Sto avendo un momento difficile mettendo in evidenza la natura di questo errore e tutti i modi possibili di duplicazione di questo. Il manifesto sul file eseguibile si trova in modalità di autorizzazioni "limitate" e pur avendo l'utente eseguire l'applicazione come amministratore genera l'errore.

È stato utile?

Soluzione

Assicurarsi che l'utente dispone di una stampante predefinita selezionata. Ho incontrato un sacco di erratici bug relativi alla stampante che alla fine sono stati causati da nessuna stampante predefinita.

Altri suggerimenti

Ho questo errore dopo l'utilizzo di un obfuscator. (Ma non offuscare alcun codice sulla stampa.)

Dopo aver scavato un po 'decompilato codice .NET ecc ho trovato una soluzione:

Basta aggiungere un codice fittizio che legge le impostazioni della stampante di computer corrente, prima di visualizzare qualsiasi PrintDialog etc.

Ecco il codice che io consiglio:

Console.Write(PrintSettings.InstalledPrinters);

Credo che questo sia un NET o un bug di Windows.

Ho avuto un errore molto simile:

    Error Description: Handle 0 is not valid.

Error Stack Trace:
   at System.Drawing.Printing.PrinterSettings.SetHdevmode(IntPtr hdevmode)
   at System.Windows.Forms.PrintDialog.UpdatePrinterSettings(IntPtr hDevMode, IntPtr hDevNames, Int16 copies, Int32 flags, PrinterSettings settings, PageSettings pageSettings)
   at System.Windows.Forms.PrintDialog.ShowPrintDialog(IntPtr hwndOwner, WndProc hookProcPtr, PRINTDLG data)
   at System.Windows.Forms.PrintDialog.RunDialog(IntPtr hwndOwner)
   at System.Windows.Forms.CommonDialog.ShowDialog(IWin32Window owner)
   at System.Windows.Forms.CommonDialog.ShowDialog()

Il problema si è rivelato che il driver di stampa era difettoso. Dopo che ho reinstallato ha funzionato bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top