c++ - 是否可以在不展开调用堆栈的情况下终止 Windows XP 上的 C++ 应用程序?

标签 c++ process windows-xp callstack raii

我的理解是,当您通过 Windows XP 中的任务管理器终止一个 C++ 应用程序时,该应用程序仍然是“干净地”销毁的——即调用堆栈将展开并且将调用所有相关的对象析构函数。不知道我的理解是否有误。

是否可以在不展开堆栈的情况下立即终止此类应用程序?

例如,应用程序可能会采用 RAII 模式,该模式会在对象被销毁时销毁或释放资源。如果通过任务管理器的传统“终止进程”是正常的,那么提供一种立即终止应用程序的方法将允许我测试不正常的关机(例如断电)。

编辑:

澄清一下,我是在寻找允许我执行此操作的现有实用程序或程序。我应该能够在我没有源代码的程序上使用该解决方案,这意味着编程解决方案是 Not Acceptable 。

编辑:

只是为了提供更多上下文,有时我不得不使用非常具有侵入性的第三方服务(例如,每隔一小时就唠叨我重启一次)。因为我知道我不需要 重新启动,所以我想终止进程/服务,这样它就不会再烦我了。不幸的是,一些第 3 方开发人员“聪明”地阻止我这样做,当我通过任务管理器终止进程时,系统将立即重新启动(我猜他们正在使用 RAII 来实现这一点)。

最佳答案

我相信任务管理器会通过发送 WM_CLOSE 消息尝试“正常”关闭,然后如果应用程序没有响应,它就会被杀死。

这个调用应该在没有警告的情况下立即终止进程:

TerminateProcess

例如:

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/

相关文章:

C++ 管道错误,pipe_wait 永远

c++ - 在 visual studio 2013 XP 工具集上构建 boost

windows-xp - 是否有用于 Windows XP 的巧克力替代品

c++ - 在 QT Creator 中更改按钮的颜色

c++ - 使用相同的流对象写入文件流或字符串流

sql-server-2008 - SQL 2008 无法终止进程

c# - 获取进程的所有 DLLS

c++ - 初始化 C++ 线程并稍后运行

c++ - 有没有办法从 ELF 中提取符号,并使用 LD 将另一个文件与先前 ELF 中定义的符号链接(symbolic link)在一起?

windows - 在 Windows 任务管理器中更改进程优先级会导致问题吗?