【问题标题】:How to avoid an error from displaying?如何避免显示错误?
【发布时间】:2011-05-29 14:08:30
【问题描述】:

如何避免显示小 Windows 错误框时出现错误?
TryExcept 不起作用,因为 Delphi 没有显示错误,而是来自程序或我认为来自 Windows。

try
Size:=TFileStream.Create(BitFile,fmOpenRead);
except on E: EFCreateError
do EC.Add('Error: ' + IntToStr(GetLastError));
end;

【问题讨论】:

  • 这个问题的更好版本表明您已经做了一些工作来确定错误消息的来源,并定义了“外部事件”的确切含义。
  • 是的。您无法判断这里发生的事情是没有错误,没有代码,甚至不确定消息来自哪里。
  • @Robrok:我很高兴看到你没有放弃开发,毕竟。但是,在这种情况下,除非您解释什么是“小窗口错误框”,否则您不太可能得到任何好的答案。或许你可以给我们一张对话框的截图,这样我们至少知道你说的是哪种错误框……
  • 我尝试过在调试器之外使用可执行文件。我仍然收到 ****** 错误,但@GolezTrol 找到了答案。我已将 TApplicationEvents 添加到我的表单中,并且 OnEeception 添加了 Memo1.Lines.Add('Error: ' + IntToStr(GetLastError);
  • 当你让你的问题变得更好时,我删除了我的反对票,RobRok,不要放弃 SO。你只需要给人们一些他们可以回答的东西。

标签: delphi error-handling delphi-7


【解决方案1】:

您的应用程序中是否显示错误?否则,它是一个未处理的异常吗?还是由 Windows 或外部应用程序显示的框?

您说的是“事件”,但事件处理程序也可以包含 try..except 块。

如果它是一个异常,并且您不知道它来自哪里,您可以使用 TApplicationEvents 类来附加 Application.OnException 事件。它将触发所有未处理的异常。在那里你可以捕获它,或者更确切地说,设置一个断点并使用堆栈跟踪来查看异常来自哪里。

【讨论】:

  • 你现在是我最喜欢的用户,你的回答有效。我爱你们。 :)
【解决方案2】:

错误框并不意味着引发了异常。错误框可以在代码中显式显示。

所以,您的问题似乎是“如何防止第 3 方代码按设计运行?”。除了反编译二进制文件之外,恐怕我不能提供太多建议,尤其是如果您没有源代码。

如果您有源代码并且知道需要替换的例程,您可以编写自己的替换并在运行时“劫持”例程。例如,fastcode 项目使用这种方法来替换 delphi 的例程,而无需重新编译 VCL。您可以在他们的项目中看到实现。

http://fastcode.sourceforge.net/

单位:FastcodePatch.pas

【讨论】:

    【解决方案3】:

    这里是

     private
        { Private declarations }
      public
       procedure MyExceptionHandler(Sender : TObject; E : Exception ); //define exception handler
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.MyExceptionHandler(Sender:TObject;E:Exception);
    begin
        //Do nothing
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnException := MyExceptionHandler;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //Generate an exception
      asm
      mov eax,8272
      mov [eax],$2FFFFF
      end 
    end;
    

    【讨论】:

    • 你有什么理由拒绝我的回答??因为我什么都看不见
    • @opc0de:没有解释代码正在做什么(或没有做什么)或它如何回答问题......一大堆代码没有帮助。 (我知道我永远不会在不理解的情况下粘贴一些代码。)除此之外......内联汇编?我敢打赌,在 Delphi 中有更好的方法来生成异常……比如,哦,我不知道,raiseing 一个。我没有投反对票,因为我对 Delphi 的了解不足以判断这段代码……但如果我这样做了,那可能就是原因。
    • 投反对票的两个明显理由 - magic 指针 8272 和 magic DWORD 2FFFFFh
    • @opc0de,我怀疑你能否解释你的“方法”背后的神奇数字来触发异常。此外,除了在批评时不要歇斯底里之外,您不应该发布代码 sn-ps 会引起读者突然的 WTF。
    • 如果您只是将 asm 更改为 raise 声明并添加一个解释性段落,您会得到很多支持
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2018-10-29
    相关资源
    最近更新 更多