1. 程式人生 > >關閉使用ShellExecute開啟的程序

關閉使用ShellExecute開啟的程序

關閉使用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()返回0GetLastError()返回的錯誤程式碼為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),關閉成功!