我有一个 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, ...