我有一个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)
我很难确定这个错误的性质以及任何可能的重复方法。可执行文件上的清单处于“受限”权限模式,甚至让用户以管理员身份运行应用程序也会生成错误。
答案 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()
问题原来是打印驱动程序有问题。我重新安装后工作正常。