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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top