QuickReport抛出“当前没有默认打印机选择”的例外情况

时间:2010-04-05 17:45:14

标签: delphi windows-services printing

我创建了一个打印TQuickReports的Delphi服务。如果编译并作为Windows应用程序运行,一切正常。但是,当转换为服务时,尝试创建包含TQuickRep组件的表单会引发异常。

此服务在许多其他方框上运行良好,但特别是没有。以下是一些细节:

  • 使用QuickReport版本4.07
  • Box是Windows Server 2008操作系统。
  • 使用Delphi 2007
  • Printer.Printers.Count 正在返回正值。事实上,我可以列出所有的打印机。
  • 我尝试使用本地系统帐户并以管理员身份登录来运行该服务。

8 个答案:

答案 0 :(得分:6)

会话0中是否设置了默认打印机?请记住,在Vista / Server 2008 / Windows 7下,服务在单独的会话中运行。登录用户是否具有默认打印机设置无关 - 它是每会话设置,不会影响会话0.

您是否可以重写代码以优雅地处理该异常并选择要使用的打印机?

答案 1 :(得分:4)

您可以通过创建一个新的双字 UserSelectedDefault 来解决此问题,其值为:1 in HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ SessionDefaultDevices \ Session_ID

确保选择了本地打印机。

答案 2 :(得分:2)

您可以为用户提供一种为服务选择打印机的方法。 Windows服务可能没有默认的打印机设置。

设置TQuickRep.PrinterSettings.PrinterIndex以设置打印机编号。然后,TQuickRep.Print打印报告。

答案 3 :(得分:2)

一位同事最终找到了解决方案。我应该添加这些是“网络”打印机而不是本地打印机(当时我不认为这与问题有关)。因此,需要使用“NetworkService”作为登录选项卡下的用户帐户安装服务。从Windows帮助:

  

要指定服务使用网络服务帐户,请单击“此帐户”和   然后键入NT AUTHORITY \ NetworkService

答案 4 :(得分:2)

我们这里有一个类似的问题。使用TS服务器,Citrix和Powerfuse 9。 Powerfuse将所有打印机都资本化,但它们是混合使用的。 这种组合导致Delphi / QReport崩溃

如果所有打印机都是从打印服务器到同一情况下的powerfuse(不重要的上层或下层甚至是混合的),问题就消失了

答案 5 :(得分:2)

实际上这是一个Delphi(5)问题。可用打印机和默认打印机的比较区分大小写(Printers.pas):

if TPrinterDevice(Objects[I]).Device = Device then
begin
   with TPrinterDevice(Objects[I]) do
      SetPrinter(PChar(Device), PChar(Driver), PChar(Port), 0);
   Exit;
end;

将比较更改为: 如果lowercase(TPrinterDevice(Objects[I]).Device) = lowercase(Device) 解决了这个问题。

答案 6 :(得分:0)

如果使用终端服务2008,多个会话的同一用户,您应该查看:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\SessionDefaultDevices\Session_ID 

而不是

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\

答案 7 :(得分:0)

我解决了类似的问题:如果Delphi应用程序(或服务)使用QuickReport,它会在系统加载默认打印机(或打印机)之前运行。

  • 当QuickReport执行TQRPrinter.Init时,printer.printers.count为零,
  • 系统加载后不久,printer.printers.count就是打印机数量
  • tqrprinter.int已执行,因此TQRPrinter.FPrinterOK为false,
  • 当您尝试打开QuickReport时,会看到此错误。

我的解决方案是在启动应用程序之前等待打印机加载(在citrix和终端服务器中)。我通过两种方式解决了这个问题,要么覆盖tqrprinter,要么延迟dpr