前言:

  最近做一个项目使用到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,表示访问拒绝,权限不够!!!

参考了这哥们写的 http://blog.csdn.net/bzhxuexi/article/details/24737767

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. Caliburn.Micro 关闭父窗体打开子窗体

    比如我们在做登录的时候需要关闭父窗体打开子窗体.使用Caliburn.Micro它的时候我们关闭登录窗口的时候主页面也会关闭. 解决方法就是在登录页面的CS里面写 IndexView iv = new ...

  2. WinAPI: ShellExecute - 打开外部程序或文件

    WinAPI: ShellExecute - 打开外部程序或文件 ShellExecute(   hWnd: HWND;        {指定父窗口句柄}   Operation: PChar;  { ...

  3. notepad++ 开启/关闭 记住最后打开的文件

    开启记住最后打开的文件 1) 6.3以前版本如下设置: 设置-->首选项-->其他 把左下角的 "记住最后打开文件" 勾选. 2) 6.3以后版本如下设置: 设置--& ...

  4. windows系统操作类和演示程序(关机,关闭显示器,打开屏幕保护程序,打开光驱等)

    /// <summary> /// 系统控制类,关机,关闭显示器,打开屏幕保存程序等 /// </summary> public class SystemPowerContro ...

  5. java中打开文件流后要关闭后重新打开

    记录错误,打开文件流一定要关闭并重新打开文件流,不然取的文件内容永远是第一次取的文件内容: /** * 读取配置文件 */ private Properties readProperties() { ...

  6. Extjs4---Cannot read property 'addCls' of null 或者 el is null 关于tab关闭后再打开不显示或者报错

    做后台管理系统时遇到的问题,关于tab关闭后再打开不显示,或者报错 我在新的tabpanel中加入了一个grid,当我关闭再次打开就会报错Cannot read property 'addCls' o ...

  7. MFC 用ShellExecute打开外部文件

    知识点: 获取CListCtrl选中文本 用ShellExecute打开外部文件 一.CListCtrl::GetFirstSelectedItemPosition CListCtrl::GetFir ...

  8. WPF MVVM从入门到精通7:关闭窗口和打开新窗口

    原文:WPF MVVM从入门到精通7:关闭窗口和打开新窗口 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 ...

  9. php安装的扩展php -m可以看到,但是phpinfo()看不到,php-fpm关闭了重新打开还是不行?

    问答 问答详情   php安装的扩展php -m可以看到,但是phpinfo()看不到,php-fpm关闭了重新打开还是不行? centos apache linux html php 3.2k 次浏 ...

随机推荐

  1. lr场景运行报错的解决方法

  2. 烈焰遮天 cocos 手游mmo 源码 解析

    引擎: cocos2.x 代码: c++ 混合 lua 游戏类型: mmo 工程结构: game : 游戏启动地方 gamelogic:接sdk相关,登陆支付统计等 libFramework:主要本游 ...

  3. 我对于react-router路由原理的学习

    目录 react-router依赖基础--history react-router是如何实现URL与UI同步 一 react-router依赖基础--history history是一个独立的第三方j ...

  4. Lambda演算(一)大道至简

    从选择信息专业开始到回炉读书为止,四舍五入码了八年代码.对于计算机科学的认知仅限于: 1)使用不同语言实现特定功能 2)实现不同算法以增进系统性能 3)搭建不同架构进行组织管理   但从未思考一些本质 ...

  5. linux-ARM的几个使用指令

    1.u-boot.bin arm-linux-gnueabi-objdump -D -b binary -m arm u-boot.bin > u-boot.s arm-linux-gnueab ...

  6. 磁盘镜像分析工具TSK

    磁盘镜像分析工具TSK   TSK(The Sleuth Kit)是一款基于命令行的数字取证工具集,用于分析磁盘镜像.该工具支持常见的各种文件系统,如Ext2/Ext3/Ext4.Fat/exFat. ...

  7. XAML实时显示更新插件LiveXAML

     XAML实时显示更新插件LiveXAML LiveXAML是Visual Studio的第三方扩展插件.该插件可以从Visual Studio Marketplace下载,也可以从官网下载http: ...

  8. BZOJ1004 HNOI Cards

    第一次学习置换群这个东西. 这题需要利用Burnside定理. 即我们求出循环节为一(转完不变)的个数的平均数也就是等价类的个数. 定义:设G={a1,a2,…ag}是目标集[1,n]上的置换群.每个 ...

  9. 【20181024T2】小C的序列【GCD性质+链表】

    题面 [错解] 一眼不可做啊 哎分治? 算不了啊 真的是,打暴力走人 20pts (事实上,还有20pts是随机数据,加个小小的特判就可以) [正解] 首先,从l开始往后gcd最多只有O(log)种取 ...

  10. 高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯

    高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk  539. 牛棚的灯 ★★☆   ...