【问题标题】:QuickReport.ExportToFilter throws "stack overflow" error when used in TWebModuleQuickReport.ExportToFilter 在 TWebModule 中使用时抛出“堆栈溢出”错误
【发布时间】:2009-11-16 14:37:31
【问题描述】:

我有一个使用 TWebModule 组件的 Web 应用程序。它在 Apache 上作为一个模块运行。下面的代码在 ExportToFilter 上引发“堆栈溢出”错误。相同的代码在 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;

【问题讨论】:

    标签: delphi quickreports


    【解决方案1】:

    如果我没记错的话,你会在无限递归方法调用中得到堆栈溢出。不过这里可能不是这样。

    【讨论】:

    • 在 QRPDFFilt.pas 的 cvtInt 函数中引发非 Delphi 异常 (ntdll.rtlconvertuLongToLargeInteger)
    【解决方案2】:

    仅晚了 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

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2010-09-10
      • 2013-09-11
      • 2014-01-26
      • 2019-02-16
      • 2011-09-10
      • 1970-01-01
      相关资源
      最近更新 更多