1

我有一个 Delphi Web 服务器,提供一些 Web 服务*。其中之一应该生成并返回 PDF 报告。

PDF 创建是使用 QReport 完成的,然后使用 ExportToFilter 过程将其导出到 PDF 文件中。

该例程在从应用程序中调用时可以正常工作,但在 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 已提交无效操作,必须关闭”windows 消息,然后又是几次,然后只是指针异常,然后出现错误 216(据我所知,这与 Windows 访问权限有关)。

谢谢!

更新(1 月 5 日):感谢 Scott W. 的回答。确实,经过一番研究,我发现了另一个建议,即只有主线程才能访问某些组件。因此,我将 QR 码设置为正常,并从 TThread 内的 Synchronize 调用中调用 main 方法(这样主线程就会处理它)。但我仍然得到同样的错误。

您提到您可以使用 QR 4 将 PDF 作为服务生成。也许这就是为什么它对我不起作用,因为我使用的是 QR 3。另一方面,您没有提到您是否在后面这样做TIdTCPServer(这是我的情况,提供 Web 服务)或者如果您自己运行它(例如,在批处理过程中)。

有人知道我的二维码版本是否有问题吗?谢谢!

* 在 Windows XP SP2 上运行 Delphi 7 和 QuickReport 3。服务器基于 Indy。

** 我有两个版本的服务器:一个 Windows 应用程序和一个 Windows 服务。两者都调用相同的内部逻辑,并且两个版本都出现问题。

更新(3 月 8 日):毕竟,我的问题是我的打印程序在另一个 dll 中,并且默认的内存管理模块有些糟糕。将我的 .dpr 的第一次使用设置为 ShareMem 会用 Borland 的实现覆盖内存管理模块,并解决了我的问题。

uses
    ShareMem, ...

(1):http ://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.thirdpartytools.general/2006-09/msg00013.html

4

1 回答 1

1

我猜它QReport.Client在代码的后面某处使用,并且您修改后的代码不再将其分配给 AProgress,您最终会出现错误。

您确定要修改 QuickReport 源吗?我在 Windows 服务中使用 QuickReport 来生成 PDF 文件,然后附加到电子邮件消息中,一切正常,无需修改 QR 源。我不记得必须进行哪些设置,但它是使用 Delphi 6 和 QR 4.06 完成的。

于 2009-01-04T22:15:46.000 回答