1

我有一个使用 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;
4

2 回答 2

0

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

于 2009-11-16T15:54:08.877 回答
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上找到)

于 2021-05-26T19:05:11.503 回答