在工作中,經常會遇到這種情況:
先判斷自己需要的某個模塊是否啟動,如果沒有啟動,那么就啟動它。
有時候需要殺掉某個進程,都需要用到進程的枚舉。
如下提供兩種查找進程的方法。
1. 采用進程快照枚舉進程的方法查找指定名稱進程
BOOL FindProcessByName(LPCTSTR szFileName, PROCESSENTRY32& pe) { // 采用進程快照枚舉進程的方法查找指定名稱進程 HANDLE hProcesses; PROCESSENTRY32 lpe = { sizeof(PROCESSENTRY32) }; CString strFileName(szFileName); strFileName.MakeLower(); // 創建進程快照 hProcesses = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcesses == INVALID_HANDLE_VALUE) return FALSE; // 獲取第一個進程實例 BOOL isExist = ::Process32First(hProcesses, &lpe); BOOL isRunning = FALSE; CString strName; while (isExist) { strName = lpe.szExeFile; strName.MakeLower(); if (-1 != strFileName.Find(strName)) { isRunning = TRUE; break; } // 遍歷下一個進程實例 isExist = ::Process32Next(hProcesses, &lpe); } if (isRunning) { memcpy(&pe, &lpe, sizeof(PROCESSENTRY32)); } CloseHandle(hProcesses); return isRunning; }
2. 直接枚舉進程
BOOL FindProcessByName(LPCTSTR szFileName) { /************************************************************************/ // 采用直接枚舉進程的方法查找指定名稱進程 /* 名 稱: FindProcessByName( LPCTSTR szFileName ) /* 功 能: 查詢指定名稱的進程是否有實例正在運行 /* 參 數: LPCTSTR szFileName, 可執行程序名稱, 例如"c:\\notepad.exe" /* 返 回 值: BOOL.TRUE, 有同名實例正在運行; FALSE, 沒有同名實例正在運行. /* 編 寫 者: Xianren Li /* 創建日期: 2007-08-17 /* 附加說明: 請注意進程的查找只是依據名稱, 無法確保找到的進程調用的是預料 /* 中的可執行文件. /* 修改記錄: /************************************************************************/ CString strFileName(szFileName); strFileName.MakeLower(); DWORD aProcesses[1024], cbNeeded, cProcesses; if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) return FALSE; cProcesses = cbNeeded / sizeof(DWORD); TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); HANDLE hProcess; CString strName; BOOL isRunning = FALSE; for (unsigned int i = 0; i < cProcesses; i++) { hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]); if (NULL != hProcess) { HMODULE hMod; DWORD cbNeeded; if (::EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) { ::GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR)); strName = szProcessName; strName.MakeLower(); if (-1 != strFileName.Find(strName)) { isRunning = TRUE; CloseHandle(hProcess); break; } } CloseHandle(hProcess); } } return isRunning; }