C++ 是否可以检测到';结束过程';外部?

C++ 是否可以检测到';结束过程';外部?,c++,windows,C++,Windows,是否有某种方法可以检测到程序被windows任务管理器的“结束进程”结束? 我知道在即将结束的应用程序中不可能做到这一点(除了将你的应用程序构建为驱动程序和hook ZwTerminateProcess),但我想知道是否有办法从外部注意到它。 我不想阻止程序终止,只是想知道它是通过“结束进程”(而不是通过任何其他方式)结束的。可能有更好的方法,但是使用一个简单的标志怎么样 当然,您必须将此标志保留在进程/程序内存之外的某个位置,如注册表、数据库或文件系统。本质上,当应用程序启动时,您将标志设置为

是否有某种方法可以检测到程序被windows任务管理器的“结束进程”结束? 我知道在即将结束的应用程序中不可能做到这一点(除了将你的应用程序构建为驱动程序和hook ZwTerminateProcess),但我想知道是否有办法从外部注意到它。
我不想阻止程序终止,只是想知道它是通过“结束进程”(而不是通过任何其他方式)结束的。

可能有更好的方法,但是使用一个简单的标志怎么样

当然,您必须将此标志保留在进程/程序内存之外的某个位置,如注册表、数据库或文件系统。本质上,当应用程序启动时,您将标志设置为“真”。当应用程序通过正常方式关闭时,您将标志设置为“假”


每次启动应用程序时,您都可以检查该标志,查看它在上次执行时是否未正确关闭。

一个选项可能是创建一个“看门狗”应用程序(可能作为服务安装),该应用程序通过
ManagementEventWatcher
类监视WMI事件以停止进程(在
System.Management
命名空间中)

您可以每隔一段时间查询进程的死亡情况,或者提出一些事件驱动的方法来警告进程的死亡


(虽然是在C#中)可以让您开始。

使用打开进程的句柄,然后使用等待函数之一等待该句柄,例如。您可以使用获取进程的退出状态。如果您需要程序在等待时对用户输入保持响应,请确保在单独的线程上等待(也可以使用零超时定期轮询,但请记住——不推荐)

完成后,不要忘记调用。在关闭所有句柄之前,进程对象不会从操作系统中完全删除,因此如果忘记调用
CloseHandle
,则会泄漏资源


请注意,无法区分进程是正常退出还是强制终止。即使您有一个约定,即您的程序通常只会以0(成功)或1(失败)的状态退出,其他一些进程也可以调用
TerminateProcess(您的进程,1)
,这将与您的普通故障模式无法区分。

根据文档,使用DLL_PROCESS_DETACH调用所有加载DLL的入口点,而不是。(退出main函数会导致调用ExitProcess,就像这样。)


您可能还想了解一下。

谢谢您的回答。因此,我可以使用Adam或Cory的方法来检测程序何时关闭,Rob的方法来判断程序是否正确关闭。现在我所缺少的只是一种区分“结束进程”和其他异常关闭情况的方法(我能想到的一些是:由于某个未修补的异常而导致的崩溃,或者仅仅是用户拔掉了计算机上的插头)。我所需要的只是TerminateProcess特有的一些行为。我的程序可以寻找的东西。任何小提示都会有所帮助!