最近做的一個項目中,運行結束時總會有進程殘留,特地上網找了一份結束進程的代碼,現在貼出來給大家參考:
BOOL KillProcessFromName(CString strProcessName)
{
? ? ? ? //創建進程快照(TH32CS_SNAPPROCESS表示創建所有進程的快照)
? ? ? ? HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
? ? ? ? //PROCESSENTRY32進程快照的結構體
? ? ? ? PROCESSENTRY32 pe;
? ? ? ? //實例化后使用Process32First獲取第一個快照的進程前必做的初始化操作
? ? ? ? pe.dwSize = sizeof(PROCESSENTRY32);
? ? ? ? //下面的IF效果同:
? ? ? ? //if(hProcessSnap == INVALID_HANDLE_VALUE)? 無效的句柄
? ? ? ? if (!Process32First(hSnapShot, &pe))
? ? ? ? {
? ? ? ? ? ? ? ? return FALSE;
? ? ? ? }
? ? ? ? //將字符串轉換為小寫
? ? ? ? strProcessName.MakeLower();
? ? ? ? //如果句柄有效? 則一直獲取下一個句柄循環下去
? ? ? ? while (Process32Next(hSnapShot, &pe))
? ? ? ? {
? ? ? ? ? ? ? ? //pe.szExeFile獲取當前進程的可執行文件名稱
? ? ? ? ? ? ? ? CString scTmp = pe.szExeFile;
? ? ? ? ? ? ? ? //將可執行文件名稱所有英文字母修改為小寫
? ? ? ? ? ? ? ? scTmp.MakeLower();
? ? ? ? ? ? ? ? //比較當前進程的可執行文件名稱和傳遞進來的文件名稱是否相同
? ? ? ? ? ? ? ? //相同的話Compare返回0
? ? ? ? ? ? ? ? if (!scTmp.Compare(strProcessName))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? //從快照進程中獲取該進程的PID(即任務管理器中的PID)
? ? ? ? ? ? ? ? ? ? ? ? DWORD dwProcessID = pe.th32ProcessID;
? ? ? ? ? ? ? ? ? ? ? ? HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID);
? ? ? ? ? ? ? ? ? ? ? ? ::TerminateProcess(hProcess, 0);
? ? ? ? ? ? ? ? ? ? ? ? CloseHandle(hProcess);
? ? ? ? ? ? ? ? ? ? ? ? return TRUE;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? scTmp.ReleaseBuffer();
? ? ? ? }
? ? ? ? strProcessName.ReleaseBuffer();
? ? ? ? return FALSE;
}
這個是通過進程名來結束進程的,希望對大家有幫助。