如何有效地杀死C ++(Win32)中的进程?

时间:2009-12-16 18:14:00

标签: c++ winapi process

我目前正在编写一个非常轻量级的程序,所以我必须使用C ++,因为它没有绑定到.NET框架,这大大增加了程序的大小。

我需要能够终止进程并且这样做我需要获得进程句柄。不幸的是,我还没有想到如何做到这一点。

P.S。我知道要杀死一个进程你必须使用 TerminateProcess

9 个答案:

答案 0 :(得分:15)

OpenProcess()所需的PID通常不容易掌握。如果你得到的只是一个进程名称,那么你需要在机器上迭代正在运行的进程。使用CreateToolhelp32Snapshot执行此操作,然后执行Process32First并使用Process32Next循环。 PROCESSENTRY32.szExeFile为您提供进程名称(不是路径!),th32ProcessID为您提供PID。

下一个考虑因素是该过程可能不止一次出现。并且有可能将相同的进程名称用于非常不同的程序。像“设置”。如果你不想只杀死它们,你需要尝试从它们获取一些运行时信息。也许是窗口标题栏文本。 GetProcessImageFileName()可以为您提供.exe的路径。它使用本机内核格式,您需要QueryDosDevice将磁盘驱动器设备名称映射到驱动器号。

下一个考虑因素是您在OpenProcess()中要求的权利。您不可能获得PROCESS_ALL_ACCESS,您只需要PROCESS_TERMINATE。虽然这也是特权。确保用于运行程序的帐户可以获得该权限。

答案 1 :(得分:13)

为什么不简单地呼叫“系统”并要求命令行杀死它,而不是经历所有痛苦来杀死具有已知名称的进程?

例如,

int retval = ::_tsystem( _T("taskkill /F /T /IM MyProcess.exe") );

答案 2 :(得分:7)

HANDLE explorer;
explorer = OpenProcess(PROCESS_ALL_ACCESS,false,2120);
TerminateProcess(explorer,1);

有效

答案 3 :(得分:5)

要获取传递给TerminateProcess的句柄,请将OpenProcessEnumProcesses等其他功能结合使用。

答案 4 :(得分:3)

以下是Visual Studio 2010 C ++项目如何通过 EXE 文件名终止进程的完整示例。

为了检查它,只需运行Internet Explorer,然后执行以下代码。

#include <iostream>
#include <string>
#include<tchar.h>
#include <process.h>
#include <windows.h>
#include <tlhelp32.h>

using namespace std;

//  Forward declarations:
BOOL GetProcessList();
BOOL TerminateMyProcess(DWORD dwProcessId, UINT uExitCode);

int main( void )
{
  GetProcessList( );
  return 0;
}

BOOL GetProcessList( )
{
  HANDLE hProcessSnap;
  HANDLE hProcess;
  PROCESSENTRY32 pe32;
  DWORD dwPriorityClass;

  // Take a snapshot of all processes in the system.
  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {   
    return( FALSE );
  }

  // Set the size of the structure before using it.
  pe32.dwSize = sizeof( PROCESSENTRY32 );

  // Retrieve information about the first process,
  // and exit if unsuccessful
  if( !Process32First( hProcessSnap, &pe32 ) )
  {   
    CloseHandle( hProcessSnap );  // clean the snapshot object
    return( FALSE );
  }

  // Now walk the snapshot of processes 
  do
  {  
    string str(pe32.szExeFile);

    if(str == "iexplore.exe") // put the name of your process you want to kill
    {
        TerminateMyProcess(pe32.th32ProcessID, 1);
    } 
  } while( Process32Next( hProcessSnap, &pe32 ) );

  CloseHandle( hProcessSnap );
  return( TRUE );
}

BOOL TerminateMyProcess(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;
}

想象一下在C#中看起来像是

using System;
using System.Collections.Generic;
using System.Text;

namespace MyProcessKiller
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
            {
                if (myProc.ProcessName == "iexplore")
                {
                    myProc.Kill();
                }
            }
        }
    }
}

答案 5 :(得分:1)

CreateProcessOpenProcess返回进程句柄。

通过要求系统列出所有进程,然后在列表中搜索所需的进程,可以找到一个sample code来查找进程。

答案 6 :(得分:0)

以下是一些工作示例代码,用于杀死一个名为&#34; ShouldBeDead.exe&#34;:

的进程
// you will need these headers, and you also need to link to Psapi.lib
#include <tchar.h>
#include <psapi.h>

...
// first get all the process so that we can get the process id 
DWORD processes[1024], count;
if( !EnumProcesses( processes, sizeof(processes), &count ) )
{
    return false;
}

count /= sizeof(DWORD);
for(unsigned int i = 0; i < count; i++)
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    if(processes[i] != 0)
    {
        // remember to open with PROCESS_ALL_ACCESS, otherwise you will not be able to kill it
        HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, processes[i] );
        if(NULL != hProcess)
        {
            HMODULE hMod;
            DWORD cbNeeded;
            if(EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
            {
                GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR));

                // find the process and kill it
                if(strcmp(szProcessName, "ShouldBeDead.exe") == 0)
                {
                    DWORD result = WAIT_OBJECT_0;
                    while(result == WAIT_OBJECT_0)
                    {
                        // use WaitForSingleObject to make sure it's dead
                        result = WaitForSingleObject(hProcess, 100);
                        TerminateProcess(hProcess, 0);
                    }

                    CloseHandle(hProcess);
                }
            }
        }
    }
}

答案 7 :(得分:0)

仅限Windows

system("taskkill /f /im servicetokill.exe")

答案 8 :(得分:0)

使用现代 C++ 的任务杀手

下面是我为我的终结者程序创建的代码

//_____________________________________________
//                                             |
// TheNexGen of Terminator (inclusion version) |
// ------------------------------------------- |
//                                             |
// Add your Programs in the 'if' check as I've |
// listed below, and compile using c++17 flag  |
// or higher                                   |
//_____________________________________________|



#include <process.h>
#include <windows.h>
#include <tlhelp32.h>
#include <string_view>
using namespace std;

int main()
{
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE) return 0;

    PROCESSENTRY32W pe32{ .dwSize = sizeof(PROCESSENTRY32) };
    if (!Process32First(hProcessSnap, &pe32)) return CloseHandle(hProcessSnap), 0;

    do
    {
        wstring_view str = pe32.szExeFile;

        if
            (
                str == L"chrome.exe"
                || str == L"AAM Update Notelse ifier.exe"
                || str == L"About.exe"
                || str == L"ActionCenterDownloader.exe"
                || str == L"adb.exe"
                || str == L"AdobeARM.exe"
            )
        {
            if (HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, pe32.th32ProcessID))
            {
                TerminateProcess(hProcess, 1);
                CloseHandle(hProcess);
            }
        }
    }
    while (Process32Next(hProcessSnap, &pe32));

    CloseHandle(hProcessSnap);
}

说明

我是 TheMR 一名 现代 C++ 程序员(具有编写高性能代码的经验)并且我已经简化、现代化并提高了所提供代码 100 倍的执行速度@DmitryBoyko

我很快将根据排除原则发布另一个版本的 TheTerminator