У меня есть веб-сервер Delphi, предоставляющий некоторые веб-сервисы *. Один из них должен генерировать и возвращать отчет в формате PDF.
Создание PDF выполняется с помощью QReport, который затем экспортируется в файл PDF с помощью процедуры ExportToFilter.
Подпрограмма работает нормально, когда вызывается из приложения, но при вызове из-за TIdTCPServer она зависает и никогда не завершается. Отладив его, я получил точку зависания:
(примечание: я сейчас дома, и у меня нет исходного кода. Я постараюсь воспроизвести исходный текст quickrpt.pas настолько точно, насколько я помню).
procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
...
AProgress := TQRFormProgress.Create(Application); // Hangs on this line
AProgress.Owner := QReport;
if ShowProgress then AProgress.Show;
QReport.Client := AProgress;
...
Выполняя поиск в Интернете, я обнаружил на этой странице (1) предложение установить для ShowProgress значение False и отредактировать код, чтобы он не создавал форму прогресса, если для ShowProgress установлено значение false (по-видимому, это связано с тем, что QReport не является многопоточным).
Итак, я отредактировал код, и теперь у меня есть это:
procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
...
if ShowProgress then
begin
AProgress := TQRFormProgress.Create(Application);
AProgress.Owner := QReport;
AProgress.Show;
QReport.Client := AProgress
end;
...
Теперь отчет выходит. Но затем служба попадает в исключение недопустимого указателя (которое я не могу отследить). После успешного завершения вызовов в службу, но когда я закрываю службу **, она снова начинает жаловаться с недопустимыми исключениями указателя, затем сообщение «MyServer совершил недопустимое действие и должен быть закрыт», а затем еще пару раз , затем просто указатель исключения, затем приходит к ошибке 216 (которая, насколько я мог выяснить, связана с разрешениями доступа Windows).
Спасибо!
Обновление (5 января) : Спасибо Скотту В. за ваш ответ . Действительно, после некоторых исследований я обнаружил еще одно предположение, что только основной поток может получить доступ к некоторым компонентам. Поэтому я установил нормальный QR-код и вызвал метод main из вызова Synchronize внутри TThread (чтобы основной поток мог его обработать). Но я все еще получаю ту же ошибку.
Вы упоминаете, что смогли сгенерировать PDF как сервис с помощью QR 4. Может быть, поэтому он не работает для меня, так как я использую QR 3. С другой стороны, вы не упоминаете, делаете ли вы что за TIdTCPServer (в моем случае это предоставление веб-сервисов) или если вы запускаете его самостоятельно (например, во время пакетного процесса).
Кто-нибудь знает, может ли быть проблема с моей версией QR? Спасибо!
* Запуск Delphi 7 и QuickReport 3 в Windows XP SP2. Сервер основан на Indy.
** У меня есть две версии сервера: приложение Windows и служба Windows. Оба вызывают одну и ту же внутреннюю логику, и проблема возникает с обеими версиями.
Обновление (8 марта) : В конце концов, моя проблема заключалась в том, что моя процедура печати находилась в другом dll, а модуль управления памятью по умолчанию несколько дрянной. Установка первого использования моего .dpr на ShareMem переопределяет модуль управления памятью с реализацией Borland и решила мою проблему.
uses
ShareMem, ...
(1): http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.thirdpartytools.general/2006-09/msg00013.html