我创建了一个打印TQuickReports的Delphi服务。如果编译并作为Windows应用程序运行,一切正常。但是,当转换为服务时,尝试创建包含TQuickRep组件的表单会引发异常。
此服务在许多其他方框上运行良好,但特别是没有。以下是一些细节:
答案 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,它会在系统加载默认打印机(或打印机)之前运行。
TQRPrinter.Init
时,printer.printers.count
为零,printer.printers.count
就是打印机数量tqrprinter.int
已执行,因此TQRPrinter.FPrinterOK
为false,我的解决方案是在启动应用程序之前等待打印机加载(在citrix和终端服务器中)。我通过两种方式解决了这个问题,要么覆盖tqrprinter
,要么延迟dpr
。