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