delphi – 在Windows中不调用ExceptProc
发布时间:2020-12-15 09:21:53 所属栏目:大数据 来源:网络整理
导读:我目前正在尝试创建一个内置在我的 Windows服务中的异常处理程序,在未处理的异常中,它将消息发送到另一个程序.我已经构建了方法并使通信工作,但似乎每次我的程序抛出错误,(我在代码中有一个加注调用来强制它.)windows捕获它而不调用Handler.谁能解释我做错了
我目前正在尝试创建一个内置在我的
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(); 我希望输出为:
但它只是显示:
然后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()的效果在运行进程中的所有线程中都是全局的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |