关闭使用ShellExecute打开的进程

最近做一个项目使用到ShellExecute来打开一个带参数的外部exe文件,关闭时遇到不少问题,最终解决,总结如下。

对于关闭ShellExecute打开的进程窗口,网上比较多的是用FindWindow方式,可惜我也不知道这窗口的名称。通过查询资料找到以下方式可以关闭进程:

// lpProcessName为打开的进程名称 带文件类型后缀 如:****.exe

void CloseProcess(LPCTSTR lpProcessName);

{

 DWORD dwQQID = GetProcessID(lpProcessName);

 HANDLE hProecss = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwQQID); //打开进程

 if(hProecss)

{

 TerminateProcess(hProecss, 0); //关闭进程

}

CloseHandle(hProecss);

}

// 遍历进程,得到进程ID

DWORD GetProcessID(LPCTSTR lpProcessName)

{

//创建进程快照

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if(hSnapshot != INVALID_HANDLE_VALUE)

{

PROCESSENTRY32 pe32 = {0};

pe32.dwSize = sizeof(pe32);

// 拿到第一个进程信息

if(!Process32First(hSnapshot, &pe32))

{

CloseHandle(hSnapshot);

return FALSE;

}

do

{

int nLen = _tcslen(lpProcessName);

int nLen2 = _tcslen(pe32.szExeFile);

if(nLen != nLen2)

{

continue;

}

//if(_tcscmp(lower(lpProcessName), lower(pe32.szExeFile)) == 0)

if(_tcscmp(lpProcessName, pe32.szExeFile) == 0)

{

return pe32.th32ProcessID;

}

} while (Process32Next(hSnapshot, &pe32));

}

return 0;

}

后来应用时发现在Win7系统关闭exe进程没有问题,但在winXP系统时关闭进程失败。

经测试是调用OpenProcess()返回0,GetLastError()返回的错误代码为5,表示访问拒绝,权限不够!

BOOL ProcessPrivilege(BOOL bEnable)

{

BOOL                   bResult = TRUE;

HANDLE               hToken=INVALID_HANDLE_VALUE;

TOKEN_PRIVILEGES     TokenPrivileges;

if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,

&hToken) == 0)

{

printf("OpenProcessToken Error: %d\n",GetLastError());

bResult = FALSE;

}

TokenPrivileges.PrivilegeCount           = 1;

TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;

LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);

AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

if(GetLastError() != ERROR_SUCCESS)

{

bResult = FALSE;

}

CloseHandle(hToken);

return bResult;

}

在CloseProcess()函数的第一行加入ProcessPrivilege(TRUE),关闭成功!

关闭使用ShellExecute打开的进程相关推荐

  1. CMD 命令行查看端口被哪个程序占用,并根据PID值,找到相应的程序,关闭掉对应服务或进程!...

    CMD 命令行查看端口被哪个程序占用,并根据PID值,找到相应的程序,关闭掉对应服务或进程! 不用任何第三方软件的情况下,打开CMD执行如下命令:1,netstat -ano 你可以查看到Local ...

  2. 各个系统下关闭占用端口号的进程

    各个系统下关闭占用端口号的进程 以8080端口为例 Windows win + R --> cmd netstat -ano | findstr 8080 查询到的最后一列即为对应进程的PID ...

  3. jenkins 安装以及Jenkins无法在界面关闭跨站请求伪造保护(CSRF)解决403以及如何关闭Jenkins杀掉所有衍生进程

    Jenkins的安装可以通过tomcat作为容器安装,由于Jenkins包就自带了servlet,所以我们只需要下载安装就可以直接启动. 1.下载war包: 官方地址下载:http://mirrors ...

  4. Linux如何关闭某个占用端口的进程

    目录 Linux如何关闭某个占用端口的进程 1)查找被占用的端口: 2)查看被占用端口的PID: 3)kill掉该进程 Linux如何关闭某个占用端口的进程 1)查找被占用的端口: netstat - ...

  5. 如何关闭docker容器里的进程

    如何关闭docker容器里的进程 1.使用docker exec 容器名 ps -ef命令查看进程信息 示例: 创建名为"redis"的容器,并在容器内部和宿主机中查看容器中的进程 ...

  6. 怎样打开mysql进程数_mysql查看最大打开进程数

    今天在群里刚刚知道这个查看打开最大进程数的命令,下面来看一下吧~ cat /proc/27095/limits | grep Max open files 查看mysql最大打开进程数的命令 我们应该 ...

  7. linux shell脚本关闭指定端口号的进程

    关闭指定进程中关键词的进程,最好找一个唯一标识 例如:项目名称 等等 文章目录 一.管道方式 1. 关闭指定程序进程号 2. 关闭指定端口号的进程(推荐使用) 3. 关闭指定进程关键词的进程(推荐使用 ...

  8. Win10计算机窗口空白,Win10系统下启用或关闭windows功能打开后显示空白如何解决...

    最近有win10系统用户在打开启用或关闭windows功能要进行操作的时候,发现打开后显示一片空白,导致无法任何操作,该怎么办呢,本文就给大家讲解一下Win10系统下启用或关闭windows功能打开后 ...

  9. 单位办公电脑声音和摄像头被关闭,如何打开笔记本麦克风和摄像头。

    单位办公电脑声音和摄像头被关闭,如何打开笔记本麦克风和摄像头. 笔记本电脑摄像头或者麦克风无法使用 摄像头和麦克风隐私权限被关闭 检查是否具有用户权限(麦克风和摄像头使用同样的方法). Win10 麦 ...

最新文章

  1. 【机器学习】24个终极项目提升您的机器学习知识和技能
  2. PHP关于curl_setopt几个参数设置的说明
  3. book: Effective Java
  4. 你怕是对MD5算法有误解
  5. centos java 乱码_CentOS 7.4 java验证码乱码的问题
  6. ACM 学习笔记(六) 图论
  7. BAT-把当前用户以管理员权限运行
  8. QQ客服代码(支持临时会话设置)
  9. 单片机项目开发设计 - 器件选型原则根据、常用单片机资源配置要点(GPIO、SPI、IIC、ADC)
  10. 动态规划基础之挖金矿问题
  11. C# winform 界面美化技巧(扁平化设计)
  12. 读书笔记--关键对话
  13. dell计算机一直重启,dell开机无限循环重启如何处理
  14. 群晖web文件服务器docker,群晖docker搭建数据库服务器
  15. linux输入密码后提示密码错误,用sudo命令没有提示输入密码,而是出现sudo:3次错误密码尝试的解决...
  16. 使用pyhton采用多线程方式ping IP
  17. QCon旧金山2016大会,议题发布及研讨会一瞥
  18. Ubuntu系统桌面版安装
  19. np.title函数作用
  20. 服务器显示post是什么意思,post请求 post请求是什么

热门文章

  1. mybatis配置文件的bug
  2. defun 函数定义
  3. 二维码批量生成下载工具
  4. 深度解析 | K8S API Server之请求处理
  5. js_ Math 方法
  6. Know more about _in_memory_undo
  7. 获取mssqlserver数据库表的字段名称,字段说明,数据类型,主键等表的信息
  8. 阅读笔记《梦断代码》其二
  9. Reachability
  10. libiconv字符集转换库在C#中的使用