C++ 使用进程ID终止进程

C++ 使用进程ID终止进程,c++,windows,winapi,process,C++,Windows,Winapi,Process,我试图显示所有正在运行的进程及其内存使用情况,并提供一个kill选项,我使用OpenProcess方法获取当前进程使用的内存。如何使用processID终止进程 代码如下: BOOL GetProcessList( ) { HANDLE hProcessSnap; HANDLE hProcess; HANDLE hToken; PROCESSENTRY32 pe32; DWORD dwPriorityClass; PROCESS_MEMORY_COUNTERS pmc;

我试图显示所有正在运行的进程及其内存使用情况,并提供一个kill选项,我使用OpenProcess方法获取当前进程使用的内存。如何使用processID终止进程

代码如下:

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

  hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
    printError( TEXT("CreateToolhelp32Snapshot (of processes)") );
    return( FALSE );
  }

  pe32.dwSize = sizeof( PROCESSENTRY32 );

  if( !Process32First( hProcessSnap, &pe32 ) )
  {
    printError( TEXT("Process32First") ); // show cause of failure
    CloseHandle( hProcessSnap );          // clean the snapshot object
    return( FALSE );
  }
  if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))
    {
        if (GetLastError() == ERROR_NO_TOKEN)
        {
            if (!ImpersonateSelf(SecurityImpersonation))
            return FALSE;

            if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken)){
                printError( TEXT("OpenThreadToken") );
            return FALSE;
            }
         }
        else
            return FALSE;
     }
    SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);
  do
  {
    printf( TEXT("\nPROCESS NAME:  %s"), pe32.szExeFile );

    dwPriorityClass = 0;
    SIZE_T  dwMin, dwMax;
    hProcess = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION , FALSE, pe32.th32ProcessID );
    if(GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS *)&pmc, sizeof(pmc)))
    {
        printf( "\nPagefileUsage: %d KB", pmc.PagefileUsage/1024); 
    } else{
        printError( TEXT("GetProcessMemoryInfo") );
    }

    CloseHandle(hProcess);
  }while( Process32Next( hProcessSnap, &pe32 ) );
  CloseHandle( hProcessSnap );
  return( TRUE );
}

由于您手头有一个
hProcess
,您可以使用它:

BOOL ok = TerminateProcess (hProcess, exit_code);
其中
exit\u code
可以是您喜欢的任何内容(尽量使其有意义,以防流程中有任何内容正在等待,并且希望知道其退出的原因)

如果您不想这样做,可以使用:

您需要检查
OpenProcess()
是否成功,因为(除其他外)您可能没有足够的访问权限,并且您需要在完成
hProcess
后关闭它,即使您已经终止了进程本身

TerminateProcess()
的文档

HANDLE hProcess = OpenProcess (PROCESS_TERMINATE, FALSE, process_id);
if (hProcess)
{
    BOOL ok = TerminateProcess (hProcess, exit_code);
    CloseHandle (hProcess);
}
else
{
    DWORD err = GetLastError ();
    ...
}