当前位置:  开发笔记 > 编程语言 > 正文

ExceptProc没有在Windows中调用

如何解决《ExceptProc没有在Windows中调用》经验,为你挑选了1个好方法。

我目前正在尝试创建一个内置在我的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秒后返回命令提示符.

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

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

编辑:

以下是一些更多信息:

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



1> Barry Kelly..:

您缺少对SetErrorMode()的调用:

SetErrorMode(SEM_NOGPFAULTERRORBOX);

这是为了防止操作系统未处理的异常过滤器显示对话框/显示调试器附加对话框.这是一个完整的示例,在我的机器上表现得如预期:

{$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()的效果在运行进程中的所有线程中都是全局的.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有