有些软件运行过程中,需要调用一些外部进程进行一些操作,如果外部进程出现异常无法退出,那么就会直接影响主程序的运行,此时就需要主程序主动将这个进程结束掉了。
本文主要介绍在Windows下如何查找对应进程并结束掉
一、通过Windows 命令
| 1 | tasklist /FI "IMAGENAME eq xxx.exe" //查找进程是否存在 | 
二、通过Windows API
- 查看进程是否存在 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57- int processExist(qint64 pid) 
 {
 int ret = 0;
 #if 0
 PROCESSENTRY32 pe32;
 // 在使用这个结构之前,先设置它的大小
 pe32.dwSize = sizeof(pe32);
 // 给系统内的所有进程拍一个快照
 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 {
 return -1;
 }
 // 遍历进程快照,轮流显示每个进程的信息
 BOOL bMore = ::Process32First(hProcessSnap, &pe32);
 while (bMore)
 {
 if (pe32.th32ProcessID == pid)
 {
 if (QString::fromWCharArray(pe32.szExeFile) == "lht_process.exe")
 {
 ret = 1;
 break;
 }
 }
 bMore = ::Process32Next(hProcessSnap, &pe32);
 }
 // 不要忘记清除掉snapshot对象
 ::CloseHandle(hProcessSnap);
 #else
 DWORD idProcess = pid;
 // 打开进程句柄
 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, idProcess);
 if (NULL != hProcess)
 {
 WCHAR sPath[MAX_PATH];
 HMODULE hMod;
 DWORD cbNeeded;
 // 获取路径
 if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
 {
 DWORD dw = GetModuleFileNameEx(hProcess, hMod, sPath, MAX_PATH);
 QString path = QString::fromWCharArray(sPath);
 QFileInfo fileInfo(path);
 if (fileInfo.fileName() == "lht_process.exe")
 {
 ret = 1;
 }
 }
 CloseHandle(hProcess);
 }
 #endif
 return ret;
 }
- 结束进程 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18- bool killProcess(qint64 pid) 
 {
 DWORD dwPid = pid;
 HANDLE hPrc;
 if (0 == dwPid) return FALSE;
 hPrc = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); // Opens handle to the process.
 if (!::TerminateProcess(hPrc, 0)) // Terminates a process.
 {
 ::CloseHandle(hPrc);
 return FALSE;
 }
 else
 ::WaitForSingleObject(hPrc, 5000);
 ::CloseHandle(hPrc);
 return TRUE;
 }
