2

我试图捕捉进程结束的时间(例如通过在任务管理器中杀死它)。为了当它检测到(在已结束的进程内)时,在退出做一些工作之前。我的应用并没有结束 byitslef (endless loop)

我试过:1)atexit 2)SetUnhandledExceptionFilter

我尝试在调试运行中简单地关闭运行的应用程序,但最终没有达到执行额外任务的目的。

帮助,

4

3 回答 3

4

这应该回答你的问题:

在任务管理器中有两种方法可以杀死应用程序。

通过应用程序选项卡杀死大致相当于 SIGTERM(在 Linux 中)。应用程序可能会拦截它并进行更多处理,因为它基本上是在发送“关闭窗口”消息。要捕获的消息是 WM_CLOSE。

通过进程选项卡杀死大致相当于 SIGKILL(在 Linux 中)。除了监视用户在任务管理器的列表框和结束进程按钮中的操作,或者拥有一个看门狗进程来查看第一个进程何时被杀死之外,您无能为力

于 2011-11-03T11:56:14.867 回答
1

枚举所有正在运行的进程。完成此操作后,您将获得进程 ID。通过之前获取的ID获取每个进程的句柄,找到你要找的进程。在单独的线程中使用相同的进程句柄,如下所示:

WaitForSingleObject(hProcess, INFINITE);

一旦进程终止,该线程将结束。

于 2011-11-03T12:17:23.253 回答
1

在控制台应用程序中,您应该考虑安装HandlerRoutine 回调函数来捕获 CTRL_C_EVENT、CTRL_BREAK_EVENT、CTRL_CLOSE_EVENT、CTRL_LOGOFF_EVENT、CTRL_SHUTDOWN_EVENT。

在 GUI 应用程序中,您应该考虑处理WM_CLOSEWM_QUERYENDSESSIONWM_ENDSESSION

于 2011-11-03T13:10:45.490 回答