關閉使用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\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),關閉成功!!!!!!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM