delphi – 在Windows中不调用ExceptProc

delphi – 在Windows中不调用ExceptProc,第1张

概述我目前正在尝试创建一个内置在我的 Windows服务中的异常处理程序,在未处理的异常中,它将消息发送到另一个程序.我已经构建了方法并使通信工作,但似乎每次我的程序抛出错误,(我在代码中有一个加注调用来强制它.)windows捕获它而不调用Handler.谁能解释我做错了什么? 简化代码解释: procedure unhandled(); begin raise Exception.Cr 我目前正在尝试创建一个内置在我的 Windows服务中的异常处理程序,在未处理的异常中,它将消息发送到另一个程序.我已经构建了方法并使通信工作,但似乎每次我的程序抛出错误,(我在代码中有一个加注调用来强制它.)windows捕获它而不调用Handler.谁能解释我做错了什么?

简化代码解释:

procedure unhandled();  begin    raise Exception.Create('Unhandled');  end;procedure ExceptionHandler(ExceptObject: TObject; ExceptAddr: Pointer);  begin    WriteLn('display: ' + Exception(ExceptObject).Message);    //send Message Here  end;

我调用此代码来运行它:

WriteLn('Starting');    ExceptProc := @ExceptionHandler;    unhandled();

我希望输出为:

Starting
display: Unhandled

但它只是显示:

Starting

然后windows在大约5秒后返回命令提示符.

为什么处理程序没有被正确调用?

附:我一直在控制台应用程序中运行这些测试以进行测试.

编辑:

以下是一些更多信息:

显然,当您有一个已分配的ExceptProc时,您的程序不应抛出正常的运行时217错误.我猜这是windows正在捕捉的内容,但是我可以看到,我的程序正在抛出运行时错误,我也无法获得ErrorProc来捕获它.

解决方法 您缺少对 SetErrorMode()的调用:

SetErrorMode(SEM_NOGPFAulTERRORBox);

这是为了防止OS unhandled exception filter显示对话框/显示调试器附加对话框.这是一个完整的示例,在我的机器上表现得如预期:

{$apptype console}uses windows,SysUtils;procedure unhandled();begin  raise Exception.Create('Unhandled');end;procedure ExceptionHandler(ExceptObject: TObject; ExceptAddr: Pointer);begin  Writeln('here');  WriteLn('display: ' + Exception(ExceptObject).Message);  Flush(Output);  Halt(1);end;procedure Go;begin  unhandled;end;begin  ExceptProc := @ExceptionHandler;  SetErrorMode(SEM_NOGPFAulTERRORBox);  Go;end.

请注意,SetErrorMode()的效果在运行进程中的所有线程中都是全局的.

总结

以上是内存溢出为你收集整理的delphi – 在Windows中不调用ExceptProc全部内容,希望文章能够帮你解决delphi – 在Windows中不调用ExceptProc所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1251272.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存