在.NET中打印PrintDocument对象时出现奇怪的错误

时间:2009-07-07 16:29:52

标签: .net winforms printdocument

我有一个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)

我很难确定这个错误的性质以及任何可能的重复方法。可执行文件上的清单处于“受限”权限模式,甚至让用户以管理员身份运行应用程序也会生成错误。

3 个答案:

答案 0 :(得分:6)

确保用户已选择默认打印机。我遇到了很多不稳定的打印机相关错误,这些错误最终都是由没有默认打印机引起的。

答案 1 :(得分:2)

使用混淆器后我遇到了这个错误。 (但没有混淆任何有关打印的代码。)

在挖掘了一些反编译的.NET代码之后,我找到了一个解决方案:

在显示任何printdialog等之前,只需添加一个读取当前计算机打印机设置的虚拟代码。

以下是我建议的代码:

Console.Write(PrintSettings.InstalledPrinters);

我认为这是一个.NET或Windows错误。

答案 2 :(得分:2)

我有一个非常类似的错误:

    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()

问题原来是打印驱动程序有问题。我重新安装后工作正常。