在TWebModule中使用时,QuickReport.ExportToFilter会引发“堆栈溢出”错误

时间:2009-11-16 14:37:32

标签: delphi quickreports

我有一个使用TWebModule组件的Web应用程序。它作为Apache上的模块运行。下面的代码在ExportToFilter上抛出“Stack Overflow”错误。相同的确切代码可以从Winforms应用程序甚至服务中正常工作。我已经看到其他讨论,这表明它与线程有关。

var
  mFileName: String;
  AExportFilter:;
begin
    mFileName := 'c:\temp\calendar.pdf';
    AExportFilter:=TQRPDFDocumentFilter.Create(mFileName);
    try

      WebSchdHistCalendarForm := TWebSchdHistCalendarForm.create(nil);
      WebSchdHistCalendarForm.quickrep1.ShowProgress := False;
      WebSchdHistCalendarForm.quickrep1.ExportToFilter(AExportFilter  );
    finally
     AExportFilter.Free;
     WebSchdHistCalendarForm.Free;
    end;

2 个答案:

答案 0 :(得分:0)

如果我没有弄错,你会在无限递归方法调用上获得Stack溢出。但这可能不是这种情况。

答案 1 :(得分:0)

仅晚了 11 年,但这对其他人可能有用,因为我刚刚在某些 Windows 10 机器上运行我的一个应用程序时遇到了这个问题。

(实际上,在我的情况下,Windows 事件日志将其报告为访问冲突,但是通过在其中一台有问题的机器上运行 WinDbg,我能够看到最初的原因是 cvtInt() 函数处的堆栈溢出.)

解决方法是在 QRPDFFilt.pas 的几个函数中将 Buf 参数标记为 const

function cvtInt(Buf: array of byte; P: Integer) : Integer;
begin
  Result:=(256*Buf[P])+(Buf[P+1]);
end;

应该是:

function cvtInt(const Buf: array of byte; P: Integer) : Integer;
begin
  Result:=(256*Buf[P])+(Buf[P+1]);
end;

对于 cvtDWord() 也是如此:

function cvtDWord(const Buf: array of byte; P: Integer) : DWORD;

(感谢 Marco Filho 提供的此解决方案,可在 devmedia.com.br 上找到)