我目前正在编写一个非常轻量级的程序,所以我必须使用C ++,因为它没有绑定到.NET框架,这大大增加了程序的大小。
我需要能够终止进程并且这样做我需要获得进程句柄。不幸的是,我还没有想到如何做到这一点。
P.S。我知道要杀死一个进程你必须使用 TerminateProcess 。
答案 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的句柄,请将OpenProcess与EnumProcesses等其他功能结合使用。
答案 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)
CreateProcess
和OpenProcess
返回进程句柄。
通过要求系统列出所有进程,然后在列表中搜索所需的进程,可以找到一个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)
下面是我为我的终结者程序创建的代码
//_____________________________________________
// |
// 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。