c# - PrintDocument.Print 导致 Win32Exception 操作成功完成

标签 c# printing

我正在尝试在 C# .NET 3.5 应用程序中打印到网络打印机并出现此异常:

The operation completed successfully

是什么原因造成的,如何解决?

System.ComponentModel.Win32Exception: The operation completed successfully
   at System.Drawing.Printing.PrinterSettings.GetHdevmodeInternal()
   at System.Drawing.Printing.PrinterSettings.GetHdevmode(PageSettings pageSettings)
   at System.Drawing.Printing.PrintController.OnStartPrint(PrintDocument document, PrintEventArgs e)
   at System.Windows.Forms.PrintControllerWithStatusDialog.OnStartPrint(PrintDocument document, PrintEventArgs e)
   at System.Drawing.Printing.PrintController.Print(PrintDocument document)
   at System.Drawing.Printing.PrintDocument.Print()
  • 该帐户有权使用网络打印机进行打印。权限设置为每个人都可以打印。
  • 打印机已被删除并重新创建。
  • 后台打印与直接打印到打印机的设置已双向切换。
  • 机器上的其他打印机工作正常
  • 网络上的其他客户端和同一台机器上的应用程序可以毫无问题地打印到这台打印机。

为了缩小问题范围,我创建了一个简单的控制台应用程序。以普通用户身份运行,应用程序打印。当以服务帐户身份运行时,服务帐户会出错。

enter image description here

我的问题的解决方案是卸载导致问题的驱动程序,然后安装较旧的驱动程序。

最佳答案

神秘消息是由 .NET Framework 中的 pinvoke 代码错误引起的。失败的基础 winapi 调用是 DocumentProperties() function .它的 pinvoke 声明如下所示:

[DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int DocumentProperties(...);

SetLastError 属性错误。从 MSDN 链接可以看出,该函数通过返回负值来指示失败。并且没有记录设置由 GetLastError() 返回的错误代码。

此错误的后果是框架将调用 Marshal.GetLastWin32Error() 来获取错误代码,并将获得一个随机值,因为 DocumentProperties() 没有设置它。 0 的值不太可能会产生“操作成功完成”异常消息。

所以需要忽略异常信息;这当然是非常无益的。不幸的是,这个 winapi 函数属于一类函数,就像大多数 GDI 函数一样,它只产生一个“它没有工作”的返回代码。它没有给出在哪里寻找问题的提示。这个怪癖有一个半正当的理由:当您调用 DocumentProperties() 时,Windows 本身做的很少;大部分工作由打印机驱动程序完成。在 winapi 中没有预留用于打印的错误代码集。一切皆有可能:打印机驱动程序不是精巧的代码块。打印机驱动程序的工作是告诉您有关问题的信息。他们应该通过弹出自己的窗口来做到这一点。从理论上讲,它们无论如何都是;如今,该分割市场中的激烈竞争并没有留下很多钱来支付优秀程序员的薪水。

当您从服务打印时,这当然不起作用。没有任何方法可以看到这样的弹出窗口,这是 Microsoft 强烈不鼓励从服务打印的核心原因。您和您客户的 IT 员工都没有机会诊断问题。阅读此 blog post有关从服务使用 PrintDocument 的附加说明。

没有人喜欢得到这样的建议,但字迹在墙上。 不要这样做

关于c# - PrintDocument.Print 导致 Win32Exception 操作成功完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1400783/

相关文章:

python - 使用 python 3 在 for 循环内的同一行中插入 sleep() 和 print()

javascript - 第一次在 chrome 浏览器中打印不工作

java - socket 打印到 Toshiba B-SA4TM

python - 打印输出()类型错误 bool

c# - 如何在 ASP.NET Core 中手动注册 AutoMapper 配置文件?

c# - 具有非基于文件的 key 的 SFTP

c# - Powershell在文件中替换参数

c# - 如何在 Ubuntu 上托管 Microsoft 机器人?

asp.net - 如何在asp.net中打印页面的一部分

c# - `ClaimsPrincipal.IsInRole` 在声明中期望什么?