【并发编程二十二】通过进程名字杀死进程TerminateProcess
- 一、代码
- 二、杀进程失败时,检查
- 1、OpenProcess的参数
- 2、UpdatePrivilege提升优先级
- 3、以管理员方式,启动进程
- 三、启动进程失败
- 1、由于找不到vcruntime140d.dll,无法继续执行代码。
- 2、由于找不到ucrtbased.dll,无法继续执行代码。
- 3、由于找不到MSVCP140d.dll,无法继续执行代码。
- 解决方案一:
- 解决方案二:
- 解决方案三
并发编程系列,我们只加写了如何启动一个子进程,这个子进程可以自己退出,但是并没有讲解如何通过进程名字强杀进程,这里我们讲解下。并讲解下可能遇到的三个问题。
一、代码
当涉及到在Windows系统上使用C++编程语言终止进程时,可以使用Windows API提供的函数来实现。
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
bool KillProcessByName(const std::string& processName) {
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to create snapshot of processes. Error code: " << GetLastError() << std::endl;
return false;
}
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnap, &pe)) {
do {
if (processName.compare(pe.szExeFile) == 0) {
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);//PROCESS_TERMINATE,PROCESS_ALL_ACCESS
if (hProcess != NULL) {
if (TerminateProcess(hProcess, 0)) {
CloseHandle(hProcess);
CloseHandle(hSnap);
return true;
}
else {
std::cerr << "Failed to terminate process. Error code: " << GetLastError() << std::endl;
CloseHandle(hProcess);
CloseHandle(hSnap);
return false;
}
}
}
} while (Process32Next(hSnap, &pe));
}
CloseHandle(hSnap);
return false;
}
void UpdatePrivilege(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
}
}
int main() {
UpdatePrivilege();
std::string processName = "helloworld.exe"; // 替换为要杀死的进程名字
if (KillProcessByName(processName)) {
std::cout << "Process " << processName << " has been killed." << std::endl;
}
else {
std::cout << "Failed to kill process " << processName << std::endl;
}
return 0;
}
以上的示例代码使用了Windows提供的两个主要函数:OpenProcess和TerminateProcess。
-
OpenProcess函数用于打开指定的进程,并返回一个进程句柄(HANDLE)。它接受三个参数:访问权限、是否继承句柄和进程ID。
-
TerminateProcess函数用于终止指定进程。它接受进程句柄和退出代码两个参数。在本例中,退出代码设为0。
在代码中,用户需要手动输入要结束的进程ID。然后,我们使用OpenProcess打开进程,并检查是否成功。如果成功,我们使用TerminateProcess函数终止进程,并输出相应的结果。
请注意,使用这个功能需要管理员权限,否则可能无法终止某些进程。还请谨慎使用此功能,确保只结束自己拥有的进程或经过授权的进程。
二、杀进程失败时,检查
OpenProcess返回null
TerminateProcess结束进程时,错误码为5
1、OpenProcess的参数
- 把PROCESS_TERMINATE 改成 PROCESS_ALL_ACCESS
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);//PROCESS_TERMINATE,PROCESS_ALL_ACCESS
2、UpdatePrivilege提升优先级
杀进程前,是否提升了优先级
void UpdatePrivilege(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
}
}
3、以管理员方式,启动进程
三、启动进程失败
当我们编译的进程拷贝到其他电脑有可能出现启动失败的情况。
1、由于找不到vcruntime140d.dll,无法继续执行代码。
2、由于找不到ucrtbased.dll,无法继续执行代码。
3、由于找不到MSVCP140d.dll,无法继续执行代码。
解决方案一:
- 安装对应版本的visual studio
解决方案二:
从有这库的电脑上拷贝这三个库到你的电脑上。(系统自带,or安装了visual studio的)
- 64位路径:C:\Windows\SysWOW64
复制到Windows系统对应的目录下。
- 32位路径:C:\Windows\System32
复制到Windows系统对应的目录下。
解决方案三
- Visual C++官方下载地址:https://support.microsoft.com/zh-cn/help/2977003/the-latest-supported-visual-c-downloads
打开Visual C++安装文件,点击安装。等待安装完毕。等待安装完毕之后,根据提示我们重启电脑即可。