[英]Need Win32 API C++ code that is equivalent to "taskkill /T /F /PID XXX"
The following code works to "kill -9" my process (see below).以下代码可以“杀死 -9”我的进程(见下文)。 But I prefer to not shell out to cmd.exe just to kill a process from my C++ program.
但我不喜欢 shell 到 cmd.exe 只是为了从我的 C++ 程序中杀死一个进程。 Is there a pure Win32 API way of doing this, specifically, with the effects of the "/T and /F" flags.
是否有一种纯粹的 Win32 API 方式来执行此操作,特别是具有“/T 和 /F”标志的效果。 I got to believe its possible since taskkill.exe was writtend in Win32 API.
我不得不相信这是可能的,因为 taskkill.exe 是用 Win32 API 编写的。
#include <iostream>
#include <string>
void KillDash9(unsigned long PID) {
std::string killcmd = std::string("")
+ std::string("taskkill /T /F /PID ")
+ std::to_string(PID);
std::cout << killcmd << std::endl;
system(killcmd.c_str());
}
Here's what I tried that didn't work:这是我尝试过的但不起作用的方法:
void KillDash9_v2(unsigned long PID) {
HANDLE pHandle = OpenProcess(
/*[in] DWORD dwDesiredAccess*/ PROCESS_TERMINATE | SYNCHRONIZE,
/*[in] BOOL bInheritHandle*/ TRUE,
/*[in] DWORD dwProcessId*/ PID
);
TerminateProcess(pHandle, 0);
WaitForSingleObject(pHandle, 500);
CloseHandle(pHandle);
}
KillDash9_v2() won't kill the process: KillDash9_v2() 不会终止进程:
"powershell -command ping -t localhost"
However, KillDash9_v1() works to kill this process.然而,KillDash9_v1() 可以杀死这个进程。
How to get KillDash9_v2() to work the same way?如何让 KillDash9_v2() 以相同的方式工作? v2 will kill powershell (3328) but it won't kill ping.exe (7236) which keeps running after killing 7236. I need to somehow enumerate the process tree starting 7246 and kill each branch under it.
v2将杀死powershell(3328),但不会杀死在杀死7236后继续运行的ping.exe(7236)。我需要以某种方式枚举从7246开始的进程树并杀死它下面的每个分支。
I added in error checking as suggested.我按照建议添加了错误检查。
void KillDash9_v3(unsigned long PID) {
// Clear Windows Error Variable
SetLastError(0);
HANDLE pHandle = OpenProcess(
/*[in] DWORD dwDesiredAccess*/ PROCESS_TERMINATE | SYNCHRONIZE,
/*[in] BOOL bInheritHandle*/ FALSE,
/*[in] DWORD dwProcessId*/ PID
);
if (pHandle == nullptr) {
long int err = GetLastError();
std::string msg = std::string("ERROR : OpenProcess failed for PID(") + std::to_string(PID) + std::string(")\n")
+ std::string("REASON : ") + WindowsGetErrorString(err) + std::string("\n")
+ std::string("CODE : ") + std::to_string(err) + std::string("\n");
std::cout << msg;
return;
}
// Clear Windows Error Variable
SetLastError(0);
BOOL rc = TerminateProcess(pHandle, 0);
if (rc == 0) {
long int err = GetLastError();
std::string msg = std::string("ERROR: TerminateProcess failed for PID(") + std::to_string(PID) + std::string(")\n")
+ std::string("REASON: ") + WindowsGetErrorString(err) + std::string("\n")
+ std::string("CODE : ") + std::to_string(err) + std::string("\n");
std::cout << msg;
return;
}
WaitForSingleObject(pHandle, 500);
CloseHandle(pHandle);
}
void ProcessKillTree_v1(unsigned long PARENT_PID)
{
std::string killcmd = std::string("")
+ std::string("taskkill /T /F /PID ")
+ std::to_string(PARENT_PID);
std::cout << killcmd << std::endl;
system(killcmd.c_str());
}
void ProcessKillTree_v2(unsigned long PARENT_PID)
{
if(PARENT_PID > 0) {
// Kill Tree
HANDLE snapshot = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0);
if(snapshot) {
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
if(Process32First(snapshot, &process)) {
do {
if(process.th32ParentProcessID==PARENT_PID) {
HANDLE process_handle
= OpenProcess(
PROCESS_TERMINATE,
FALSE,
process.th32ProcessID
);
if(process_handle) {
ProcessKillTree(process.th32ProcessID);
//TerminateProcess(process_handle, 2);
//CloseHandle(process_handle);
}
}
}
while (Process32Next(snapshot, &process));
}
CloseHandle(snapshot);
}
// Kill Parent
HANDLE parent_handle = OpenProcess(
PROCESS_TERMINATE,
FALSE,
PARENT_PID);
TerminateProcess(parent_handle, 2);
CloseHandle(parent_handle);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.