最近做的一個項目中,運(yùn)行結(jié)束時總會有進(jìn)程殘留撇他,特地上網(wǎng)找了一份結(jié)束進(jìn)程的代碼,現(xiàn)在貼出來給大家參考:
BOOL KillProcessFromName(CString strProcessName)
{
? ? ? ? //創(chuàng)建進(jìn)程快照(TH32CS_SNAPPROCESS表示創(chuàng)建所有進(jìn)程的快照)
? ? ? ? HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
? ? ? ? //PROCESSENTRY32進(jìn)程快照的結(jié)構(gòu)體
? ? ? ? PROCESSENTRY32 pe;
? ? ? ? //實例化后使用Process32First獲取第一個快照的進(jìn)程前必做的初始化操作
? ? ? ? pe.dwSize = sizeof(PROCESSENTRY32);
? ? ? ? //下面的IF效果同:
? ? ? ? //if(hProcessSnap == INVALID_HANDLE_VALUE)? 無效的句柄
? ? ? ? if (!Process32First(hSnapShot, &pe))
? ? ? ? {
? ? ? ? ? ? ? ? return FALSE;
? ? ? ? }
? ? ? ? //將字符串轉(zhuǎn)換為小寫
? ? ? ? strProcessName.MakeLower();
? ? ? ? //如果句柄有效? 則一直獲取下一個句柄循環(huán)下去
? ? ? ? while (Process32Next(hSnapShot, &pe))
? ? ? ? {
? ? ? ? ? ? ? ? //pe.szExeFile獲取當(dāng)前進(jìn)程的可執(zhí)行文件名稱
? ? ? ? ? ? ? ? CString scTmp = pe.szExeFile;
? ? ? ? ? ? ? ? //將可執(zhí)行文件名稱所有英文字母修改為小寫
? ? ? ? ? ? ? ? scTmp.MakeLower();
? ? ? ? ? ? ? ? //比較當(dāng)前進(jìn)程的可執(zhí)行文件名稱和傳遞進(jìn)來的文件名稱是否相同
? ? ? ? ? ? ? ? //相同的話Compare返回0
? ? ? ? ? ? ? ? if (!scTmp.Compare(strProcessName))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? //從快照進(jìn)程中獲取該進(jìn)程的PID(即任務(wù)管理器中的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;
}
這個是通過進(jìn)程名來結(jié)束進(jìn)程的困肩,希望對大家有幫助。