如何在C++;(Win32)? 我目前正在编写一个非常轻量级的程序,所以我必须使用C++,因为它不绑定到.NETFramework,这大大增加了程序的大小。p>

如何在C++;(Win32)? 我目前正在编写一个非常轻量级的程序,所以我必须使用C++,因为它不绑定到.NETFramework,这大大增加了程序的大小。p>,c++,winapi,process,C++,Winapi,Process,我需要能够终止进程,为此我需要一个进程句柄。不幸的是,我还没有想到怎么做。 另外,我知道要终止进程,必须使用TerminateProcess.和返回进程句柄 下面是一些查找流程的方法,方法是要求系统列出所有流程,然后在列表中搜索所需的流程。要获得要传递到的句柄,请与其他函数(如)结合使用 这很有效OpenProcess()所需的PID通常不容易掌握。如果您得到的只是一个进程名,那么您需要迭代机器上正在运行的进程。使用CreateToolhelp32Snapshot执行此操作,然后是Process

我需要能够终止进程,为此我需要一个进程句柄。不幸的是,我还没有想到怎么做。

另外,我知道要终止进程,必须使用TerminateProcess.

和返回进程句柄


下面是一些查找流程的方法,方法是要求系统列出所有流程,然后在列表中搜索所需的流程。

要获得要传递到的句柄,请与其他函数(如)结合使用


这很有效

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

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


接下来要考虑的是您在OpenProcess()中要求的权限。您不太可能获得
PROCESS\u ALL\u访问权
,您只需要
PROCESS\u TERMINATE
。尽管这也是特权。确保您用于运行程序的帐户能够获得该权限。

与其痛苦地用一个已知名称终止一个进程,为什么不直接调用“system”并要求命令行终止它呢

比如说,

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

下面是一些用于终止名为“ShouldBeDead.exe”的进程的工作示例代码:

//您需要这些标题,还需要链接到Psapi.lib
#包括
#包括
...
//首先获取所有进程,以便获取进程id
DWORD进程[1024],计数;
if(!枚举进程(进程、sizeof(进程)和计数))
{
返回false;
}
count/=sizeof(DWORD);
for(无符号整数i=0;i 

这是VisualStudio 2010 C++项目的完整示例,如何通过<强> exe <强>文件名来杀死进程。

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

#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;
}
仅限窗口

system("taskkill /f /im servicetokill.exe")
使用现代C++的任务杀手 下面是我为Terminator程序创建的代码

//_____________________________________________
//                                             |
// 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);
}
//_____________________________________________
//                                             |
//TheNexGen终端(包含版本)|
// ------------------------------------------- |
//                                             |
//在“如果”复选框中添加您的程序|
//下面列出,并使用c++17进行编译|
//或更高|
//_____________________________________________|
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
HANDLE hprocessnap=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
if(hprocessnap==无效的\u句柄\u值)返回0;
PROCESSENTRY32W pe32{.dwSize=sizeof(PROCESSENTRY32)};
如果(!Process32First(hprocessnap,&pe32))返回CloseHandle(hprocessnap),则为0;
做
{
wstring_view str=pe32.szExeFile;
如果
(
str==L“chrome.exe”
||str==L“AAM更新说明文件生成器.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))
{
终止进程(hProcess,1);
CloseHandle(hProcess);
}
}
}
while(Process32Next(hprocessnap,&pe32));
CloseHandle(hProcessSnap);
}
描述 我是TheMR一名现代C++程序员(具有生成高性能代码的经验),我将@DmitryBoyko提供的代码简化、现代化并将执行速度提高了100倍


我将很快发布另一个基于排除原则的终端版本。

我过去使用过pgrep和pkill,但那是在Solaris时代。你的意思是在Win32中。没有什么与C++相关的…是的,你是对的,所以使用带有进程ID的OpenProcess将
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();
                }
            }
        }
    }
}
system("taskkill /f /im servicetokill.exe")
//_____________________________________________
//                                             |
// 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);
}