是否有可能从外部检测“终端过程”?

时间:2011-09-15 18:03:42

标签: c++ windows

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

4 个答案:

答案 0 :(得分:1)

可能有更好的方法 - 但是如何使用简单的旗帜?

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

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

答案 1 :(得分:1)

使用OpenProcess打开进程句柄,然后使用WaitForSingleObject之一等待函数等待该句柄。您可以使用GetExitCodeProcess获取流程的退出状态。如果您需要程序在等待时保持对用户输入的响应,那么请确保在单独的线程上等待(或者您可以使用零超时定期轮询,但请记住the performance consequences of polling - 不推荐)。

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

请注意,无法区分正常退出流程或强行终止流程。即使你有一个约定,你的程序通常只有状态为0(成功)或1(失败),但其他一些进程可能会调用TerminateProcess(YourProcess, 1),这与普通的失败模式无法区分。 / p>

答案 2 :(得分:1)

根据文档,ExitProcess使用DLL_PROCESS_DETACH调用所有加载的DLL的入口点,而TerminateProcess则没有。 (退出main函数会导致调用ExitProcess,most unhandled exceptions也是如此。)

您可能还想查看Application Recovery and Restart

答案 3 :(得分:0)

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

您可以在一定时间间隔内查询流程的死亡情况,或者以事件驱动的方式提醒您流程的消亡。

Here's sort of an example(虽然它在C#中)可以让你开始。