Странная ошибка при печати объекта PrintDocument в .NET
-
11-09-2019 - |
Вопрос
У меня есть приложение Winforms, которое генерирует собственный объект PrintDocument для печати.По моим собственным тестам, он отлично работает в XP и Windows 7, но один пользователь получил следующее исключение в Vista, когда он выбрал команду печати с открытым документом:
************** 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)
Мне трудно понять природу этой ошибки и любые потенциальные способы ее дублирования.Манифест исполняемого файла находится в режиме «ограниченных» разрешений, и даже если пользователь запускает приложение от имени администратора, возникает ошибка.
Решение
Убедитесь, что у пользователя выбран принтер по умолчанию.Я столкнулся с множеством хаотичных ошибок, связанных с принтером, которые в конечном итоге были вызваны отсутствием принтера по умолчанию.
Другие советы
У меня возникла эта ошибка после использования обфускатора.(но не запутывал код печати.)
После раскопок декомпилированного кода .NET и т. д.Я нашел решение:
Просто добавьте фиктивный код, который считывает настройки принтера текущего компьютера перед отображением какого-либо диалогового окна печати и т. д.
Вот код, который я рекомендую:
Console.Write(PrintSettings.InstalledPrinters);
Я думаю, что это ошибка .NET или Windows.
У меня была очень похожая ошибка:
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()
Проблема оказалась в том, что драйвер печати был неисправен.После того, как я переустановил, все заработало нормально.