error estranha impressão PrintDocument objeto no .NET
-
11-09-2019 - |
Pergunta
Eu tenho um aplicativo WinForms que gera seu próprio objeto PrintDocument para impressão. Ele funciona bem no XP e no Windows 7 com o meu próprio teste, mas um usuário foi recebendo a seguinte exceção no Vista quando eles selecionam o comando de impressão com um documento aberto:
************** 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)
Eu estou tendo um momento difícil remendar a natureza desse erro e quaisquer formas potenciais de duplicar este. O manifesto no executável está no modo de permissões "limitado" e mesmo tendo o usuário executar o aplicativo como um administrador gera o erro.
Solução
Verifique se o usuário tem uma impressora padrão selecionada. Eu correr em um monte de erros relacionados com o funcionamento irregular da impressora que, finalmente, foram causados ??por nenhuma impressora padrão.
Outras dicas
Eu tenho esse erro depois de usar um ofuscador. (Mas não ofuscar qualquer código sobre a impressão.)
Depois de cavar algum código .NET compilado etc. eu encontrei uma solução:
Basta adicionar um código fictício que lê as configurações da impressora de computador atual, antes de exibir qualquer PrintDialog etc.
Aqui está o código que eu vou recomendar:
Console.Write(PrintSettings.InstalledPrinters);
Eu acho que este é um .NET ou um bug do Windows.
Eu tinha um erro muito semelhante:
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()
O problema acabou por ser que o driver de impressão estava com defeito. Depois eu reinstalei ele funcionou bem.