zoukankan      html  css  js  c++  java
  • 关闭使用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,表示访问拒绝,权限不够!!!

    参考了这哥们写的 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 ",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),关闭成功!!!!!!!!

  • 相关阅读:
    (转载)什么才是富人思维
    linux上的vs code的C++环境搭建
    [转载]双线性插值简介
    刻意练习行动手册
    滑动窗口技巧
    [转载]用于深入思考的小工具
    CF632E Thief in a Shop
    BZOJ1497 最大获利
    UVA10779 Collectors Problem
    洛谷P4311 士兵占领
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/7503868.html
Copyright © 2011-2022 走看看