【并发编程二十二】通过进程名字杀死进程TerminateProcess

news/2024/11/19 9:19:58/

【并发编程二十二】通过进程名字杀死进程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_ACCESSif (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++安装文件,点击安装。等待安装完毕。等待安装完毕之后,根据提示我们重启电脑即可。


http://www.ppmy.cn/news/911936.html

相关文章

图-邻接矩阵

图的邻接矩阵表示法 参考b站视频 用一维数组存储顶点信息&#xff0c;用二维数组存储顶点与顶点之间的边关系 创建接口类 先定义图要实现的方法 package com.testgraph; public interface Graph<V> {//获取顶点数int getVerticesSize();//获取边数int getEdgesSize(…

丰农控股 CIO 王轶枭:万亿级农资市场,神策数据助力大丰收筑就数据驱动核心竞争力...

丰农控股集团成立于 2014 年初&#xff0c;是国内专业的农业产业服务集团。集团多年来聚焦国内种植领域&#xff0c;以“提升农业价值”为使命&#xff0c;为国内 2.6 亿种植户提供专业服务&#xff0c;帮助种植户解决传统农资流通渠道单一、农技知识薄弱、田间服务不完整、农产…

招商证券:知识型券商如何推动企业知识资产化管理

一百人的专家队伍&#xff0c;一百个重点知识地图&#xff0c;一百场专题知识讲座&#xff0c;一百个内部经典案例”&#xff0c;招商证券通过“四个一工程”推动了公司核心知识传承&#xff0c;快速提升了最佳实践传播周期和新知识产品响应时间。招商证券凭借在知识管理实践的…

week27

这周是磨难的一周不知道NT装了多少次系统&#xff0c;删除了多少数据好消息是把BIOS和ubuntu安装地很熟练了&#xff0c;而且经过爱上了心仪的Ubuntu23.04&#xff0c;就是她了坏消息是一个学期做的笔记全都没了&#xff0c;以后不好回忆了&#xff0c;好消息是不用考试了&…

SpringBoot整合knife4j

knife4j 文档地址&#xff1a;https://doc.xiaominfo.com/ knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 Swagger介绍 前后端分离开发模式中&#xff0c;api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和…

Redis进阶底层原理-Cluster集群底层

Redis实现高可用的方案有很多中&#xff0c;先了解下高可用和分区的概念&#xff1a; 高可用是指系统在面对硬件故障、网络故障、软件错误等意外问题时&#xff0c;仍能给客户端提供正常的服务&#xff0c;尽量的减少服务的阻塞、终端现象。在高可用的方案中一般会采用冗余备份…

i910980hk和 i9-10900K哪个好

由于i9-10900K是桌面处理器&#xff0c;基本不需要考虑节能和散热问题&#xff0c;因此默频下性能比10980HK高。 我的笔记本就是活动时8折抢购的https://list.jd.com/list.html? 英特尔 i9-10900K为 10 核 20 线程&#xff0c;主频 3.7GHz&#xff0c;睿频最高可达 5.3GHz&am…

A14性能超酷睿i9,ARM终于超越了Intel

苹果最新发布的A14处理器性能比去年的A13提升了16%&#xff0c;而去年的A13处理器已与Intel的顶级PC处理器酷睿i9-10920X相当&#xff0c;如此一来A14处理器的性能应该已超过Intel的酷睿i9处理器。 如今推出的Geekbench5的分数作出了很大调整&#xff0c;故以去年的Geekbench4测…