前言:
最近做一個項目使用到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),關閉成功!!!!!!!!