2

我有一个在 Server 2008 上作为 Windows 服务运行的应用程序。当我将它作为应用程序运行并发送打印作业时,打印作业会成功处理。但是,如果我将打印作业发送到 Windows 服务,则会引发“句柄无效”异常。

这是错误:

Printing Thread error: The handle is invalid. StackTrace:    at System.Drawing.Printing.StandardPrintController.OnStartPrint(PrintDocument document, PrintEventArgs e)   at System.Drawing.Printing.PrintController.Print(PrintDocument document)   at System.Drawing.Printing.PrintDocument.Print()   at GrapeCity.ActiveReports.Viewer.Win.Printing.PrintImpl.DocumentPrinter.<Print>b__1e()

该服务在具有管理员权限的管理员帐户下运行。

任何帮助,将不胜感激!

4

3 回答 3

1

需要检查的一些事项:

  1. 确保运行该服务的用户帐户在其帐户下安装了正确的打印机,并将其设置为默认打印机。
  2. 确保您在 ActiveReports 中使用不显式显示任何 UI 的 Print 方法。
  3. 尝试从服务控制面板小程序中选中服务属性页上的“允许服务与桌面交互”复选框。尽管您可能没有显示任何 UI,但打印机驱动程序可能需要该功能。

最后,请记住,通常从 Windows 服务打印有点不稳定。甚至Microsoft 的 System.Drawing.Printing 文档也有以下免责声明:

不支持在 Windows 服务或 ASP.NET 应用程序或服务中使用 System.Drawing.Printing 命名空间中的类。尝试从这些应用程序类型之一中使用这些类可能会产生意想不到的问题,例如服务性能下降和运行时异常。

这并不意味着它不起作用,而是它很容易出错,以至于微软不想在这种情况下帮助我们打印。我怀疑这是因为制造商的打印机驱动程序不一定是为从非 UI 进程(如 Windows 服务)打印而设计的。

于 2013-06-13T17:16:23.337 回答
1

我在 ASP.NET 应用程序中遇到了这个问题。根本原因是网站运行所在的 IIS 应用程序池中设置了“启用 32 位应用程序”。

打印功能似乎试图连接到 32 位驱动程序,而不是已安装的 64 位驱动程序。

也许在 .NET Windows 应用程序中,“目标 CPU”设置也可能导致类似问题?即,如果您以 x86 为目标并尝试在 x64 上运行您的应用程序,它只会连接到 32 位打印机驱动程序?

于 2014-11-25T07:12:15.190 回答
1

鲁苏尔

这可能是权限或打印机访问问题。要检查它是否与 ActiveReports 相关,您是否可以创建一个单独的应用程序,实现 system.printing.drawing 并将其作为服务运行,就像您使用 ActiveReports 一样并让我们知道。

于 2013-06-12T23:13:57.883 回答