我的理解是,当您通过 Windows XP 中的任务管理器终止一个 C++ 应用程序时,该应用程序仍然是“干净地”销毁的——即调用堆栈将展开并且将调用所有相关的对象析构函数。不知道我的理解是否有误。
是否可以在不展开堆栈的情况下立即终止此类应用程序?
例如,应用程序可能会采用 RAII 模式,该模式会在对象被销毁时销毁或释放资源。如果通过任务管理器的传统“终止进程”是正常的,那么提供一种立即终止应用程序的方法将允许我测试不正常的关机(例如断电)。
编辑:
澄清一下,我是在寻找允许我执行此操作的现有实用程序或程序。我应该能够在我没有源代码的程序上使用该解决方案,这意味着编程解决方案是 Not Acceptable 。
编辑:
只是为了提供更多上下文,有时我不得不使用非常具有侵入性的第三方服务(例如,每隔一小时就唠叨我重启一次)。因为我知道我不需要 重新启动,所以我想终止进程/服务,这样它就不会再烦我了。不幸的是,一些第 3 方开发人员“聪明”地阻止我这样做,当我通过任务管理器终止进程时,系统将立即重新启动(我猜他们正在使用 RAII 来实现这一点)。
最佳答案
我相信任务管理器会通过发送 WM_CLOSE 消息尝试“正常”关闭,然后如果应用程序没有响应,它就会被杀死。
这个调用应该在没有警告的情况下立即终止进程:
例如:
TerminateProcess(GetCurrentProcess(), 1);
更新:
您可能会发现这篇文章很有趣:
Quitting time: exiting a C++ program
更新 2:
I should be able to use the solution on programs that I don't have the source code for
嗯,在 99.9% 的情况下,这是不受欢迎的行为。
SysInternals 有一个名为 pskill
的实用程序:
http://technet.microsoft.com/en-us/sysinternals/bb896683.aspx
但我不确定它有多“好”。
您可能需要自己动手,但这应该很简单:
DWORD pid = <get pid from command line>;
TerminateProcess(OpenProcess(PROCESS_TERMINATE, FALSE, pid));
关于c++ - 是否可以在不展开调用堆栈的情况下终止 Windows XP 上的 C++ 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1331954/