代码之家  ›  专栏  ›  技术社区  ›  Dillie-O

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

  •  1
  • Dillie-O  · 技术社区  · 15 年前

    我有一个WinForms应用程序,它生成自己的打印文档对象进行打印。在XP和Windows7中,它在我自己的测试中运行良好,但在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 回复  |  直到 9 年前
        1
  •  6
  •   MusiGenesis    15 年前

    确保用户选择了默认打印机。我遇到了很多与打印机相关的错误,这些错误最终是由没有默认打印机造成的。

        2
  •  2
  •   ahmkara    14 年前

    使用模糊器后出现了这个错误。(但没有混淆任何有关打印的代码。)

    在挖掘了一些已分解的.NET代码等之后,我找到了一个解决方案:

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

    以下是我将推荐的代码:

    Console.Write(PrintSettings.InstalledPrinters);
    

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

        3
  •  2
  •   grahamesd    14 年前

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

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

    问题是打印驱动程序出了故障。我重新安装后,它工作得很好。

    推荐文章