在 Windows 上获取应用程序的先前退出代码
Posted
技术标签:
【中文标题】在 Windows 上获取应用程序的先前退出代码【英文标题】:Getting previous exit code of an application on Windows 【发布时间】:2012-02-15 07:19:34 【问题描述】:有什么方法可以查出应用程序上次运行时的最后退出代码是什么?
我想检查应用程序上次是否没有以零退出代码退出(这意味着在我的情况下异常终止)如果是这样,请进行一些检查并可能修复/清理以前生成的数据。
由于某些应用程序会这样做(它们会发出警告并询问您这次是否要在安全模式下运行)我想也许 Windows 可以告诉我这一点。
如果不是,这样做的最佳做法是什么?当应用程序正确终止时在文件或其他东西上设置一个标志,并在下次执行时检查它?
【问题讨论】:
【参考方案1】:不,退出代码没有永久记录。只要进程的句柄保持打开状态,它就存在。并由 GetExitCodeProcess() 返回,它需要那个句柄。一旦最后一个句柄关闭,退出代码就永远消失了。一种技术是一个小的引导程序应用程序,它启动进程并保留句柄。然后它还可以做其他方便的事情,例如发送警报、保留日志、清理部分文件或记录崩溃的小型转储。使用 WaitForSingleObject() 检测进程退出。
顺便说一句,您肯定想退出代码号来表示相反的意思。零始终是“正常退出”值。这可以帮助您检测硬崩溃。 Windows强制终止应用时退出码始终为非零,设置为异常码。
还有其他方法,您确实可以创建一个指示进程正在运行的文件或注册表项,并在它启动备份时检查它。唯一真正的复杂之处在于,当用户启动程序两次时,您需要做一些有意义的事情。这是一个很难解决的问题,这样的应用程序通常是单实例应用程序。您使用命名互斥体来检测程序的实例是否已在运行。用进程 ID 和开始时间印制证据是可行的。
【讨论】:
【参考方案2】:在 Windows 平台上没有执行此操作的标准方法。
处理这种情况最简单的方法是在注册表上放一个值,并在程序退出时清除它。
如果程序启动时该值仍然存在,则程序意外终止。 在 HKCU/Software// 中输入一个值,以确保您拥有足够的权限(在这种情况下,该值将针对每个用户)。
【讨论】:
以上是关于在 Windows 上获取应用程序的先前退出代码的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法获取早期管道 Scala 进程 (#|) 的退出代码?
如何在windows c++中的cmd中运行命令后获取退出代码