【问题标题】:C++ TerminateProcess functionC++ TerminateProcess 函数
【发布时间】:2010-03-14 20:54:06
【问题描述】:

我一直在搜索 Win32 API C++ 函数 TerminateProcess() 的示例,但找不到任何示例。

我一般对 Win32 API 不是很熟悉,所以我想问一下这里比我更擅长的人是否可以给我举个例子,

  • 通过终止进程所需的 PID 检索进程句柄,然后使用它调用 TerminateProcess。

如果您不熟悉 C++,C# 等价物也会有所帮助。

【问题讨论】:

  • 你只是在寻找这个 WINAPI 函数 OpenProcess msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx 吗?将它与 TerminateProcess 放在一起应该不会太难。
  • 不,我想终止一个正在运行的进程。这就是为什么我提到我必须先检索它的 PID。
  • 当有人给你一个链接时,请阅读它。不要只从名称中假设它的作用。事实上,OpenProcess 创建一个进程句柄,给定一个 PID,这正是您所要求的。 @Charles:这应该是答案而不是评论。
  • @Ben Voigt:显然这不是完整的答案,因为最后一条评论表明我们需要从某个地方检索 PID。 @jemper:您要终止哪个进程?如果不是通过 PID,你如何识别它?
  • 既然你想终止一个你没有开始的进程,我想给你答案的第一件事就是你打算如何定位这个进程。您是在寻找给定的可执行文件,还是会显示进程并询问用户,或者它是打开给定文件的进程等?如果多个流程符合该模式怎么办?

标签: c++ windows process termination


【解决方案1】:

要回答最初的问题,为了通过 PID 检索进程句柄并调用 TerminateProcess,您需要如下代码:

BOOL TerminateProcessEx(DWORD dwProcessId, UINT uExitCode)
{
    DWORD dwDesiredAccess = PROCESS_TERMINATE;
    BOOL  bInheritHandle  = FALSE;
    HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
    if (hProcess == NULL)
        return FALSE;

    BOOL result = TerminateProcess(hProcess, uExitCode);

    CloseHandle(hProcess);

    return result;
}

请记住,TerminateProcess 不允许其目标清理并以有效状态退出。使用前请三思。

【讨论】:

  • 如何获取进程的PID?
  • 对于您想要 PID 的进程,您有什么样的标识符?
  • 这不必是唯一的。您可能同时运行多个可执行文件实例。您可以使用 EnumProcesses 获取具有给定名称的进程的所有实例或应用一些额外的选择标准。
  • 注意这会立即返回。虽然死亡进程可能仍然持有一些锁一段时间。您可能需要使用GetExitCodeProcess 添加一个循环,以确保该进程已经终止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2011-02-07
  • 2011-09-17
相关资源
最近更新 更多