QuickReport выдает исключение «Принтер по умолчанию не выбран» - PullRequest
4 голосов
/ 05 апреля 2010

Я создал службу Delphi, которая печатает TQuickReports. Все работает нормально, если скомпилировано и запущено как приложение Windows. Но при преобразовании для работы в качестве службы при попытке создать форму, содержащую компонент TQuickRep, возникает исключение.

Эта служба отлично работает на многих других компьютерах, но не на этой. Вот некоторые детали:

  • Использование QuickReport версии 4.07
  • Box - операционная система Windows Server 2008.
  • Использование Delphi 2007
  • Printer.Printers.Count возвращает положительное значение. На самом деле я могу перечислить все принтеры.
  • Я попытался запустить службу с использованием учетной записи локальной системы и вошел в систему как администратор.

Ответы [ 8 ]

6 голосов
/ 05 апреля 2010

Является ли принтером по умолчанию, установленным в сеансе 0? Помните, что в Vista / Server 2008 / Windows 7 службы запускаются в отдельном сеансе. Независимо от того, имеет ли вошедший в систему пользователь набор принтеров по умолчанию, не имеет значения - это настройка для сеанса и не влияет на сеанс 0.

Можете ли вы переписать код для корректной обработки этого исключения и выбрать принтер для использования?

4 голосов
/ 17 февраля 2012

Вы можете решить эту проблему, создав новое dword UserSelectedDefault со значением: 1 в HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ SessionDefaultDevices \ Session_ID

Убедитесь, что выбран локальный принтер.

2 голосов
/ 19 апреля 2012

На самом деле это проблема 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) решает проблему.

2 голосов
/ 02 февраля 2012

У нас была проблема симуляции. Использование серверов TS, Citrix и Powerfuse 9. В Powerfuse все принтеры были написаны заглавными буквами, однако они использовались в смешанном регистре. Эта комбинация вызвала сбой Delphi / QReport

Когда все принтеры от сервера печати до powerfuse в одном и том же случае (не важно верхний или нижний или даже смешанный), проблема исчезла

2 голосов
/ 08 апреля 2010

В итоге коллега нашел решение. Я должен был добавить, что это «сетевые» принтеры, а не локальные (в то время я не думал, что это связано с проблемой) Таким образом, служба должна быть установлена ​​с «NetworkService» в качестве учетной записи пользователя на вкладке входа в систему. Из справки Windows:

Чтобы указать, что служба использует учетную запись сетевой службы, щелкните Эта учетная запись и затем введите NT AUTHORITY \ NetworkService

2 голосов
/ 05 апреля 2010

Вы можете дать пользователю возможность выбрать принтер для услуги. Служба Windows, вероятно, не имеет установленного принтера по умолчанию.

Установите TQuickRep.PrinterSettings.PrinterIndex для установки номера принтера. Затем TQuickRep.Print, чтобы распечатать отчет.

0 голосов
/ 10 августа 2012

Я решил похожую проблему: если приложение (или служба) Delphi использует QuickReport, оно запускается до того, как система загрузит принтер (или принтеры) по умолчанию.

  • Когда QuickReport выполняет TQRPrinter.Init, printer.printers.count равен нулю,
  • вскоре после загрузки системы, printer.printers.count - это количество принтеров,
  • но tqrprinter.int уже выполнен, поэтому TQRPrinter.FPrinterOK ложно,
  • вы увидите эту ошибку при попытке открыть QuickReport.

Решением для меня было дождаться загрузки принтеров перед запуском приложения (в Citrix и терминальном сервере). Я решил это двумя способами: либо переписав tqrprinter, либо отложив dpr.

0 голосов
/ 25 сентября 2010

Если вы используете терминальные службы 2008, один и тот же пользователь для нескольких сессий, вы должны посмотреть:

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

вместо

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...