gpt4 book ai didi

delphi - exceptProc 在 Windows 中未被调用

转载 作者:行者123 更新时间:2023-12-03 15:22:52 25 4
gpt4 key购买 nike

我目前正在尝试创建一个内置于我的 Windows 服务中的异常处理程序,该处理程序在出现未处理的异常时向另一个程序发送消息。我已经构建了该方法并让通信正常工作,但似乎每次我的程序抛出错误时(我在代码中都有一个引发调用来强制它。)Windows 会捕获它,并且不会调用处理程序。谁能解释一下我做错了什么?

解释的简化代码:

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);

这是为了防止操作系统 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 - exceptProc 在 Windows 中未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/226896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com