2011-08-17 62 views
0

我希望我的C++程序能夠掃描進程,並且在某個file.exe運行時,我希望我的程序執行某些操作(此處不相關)。你能幫我完成這項任務嗎?掃描進程並在發現特定情況時執行某些操作

我在網上找到了一些東西。這個可以嗎 ?

CreateMutex(NULL, FALSE, NAMEofTHEprocess_exe); 
if (GetLastError() == ERROR_ALREADY_EXISTS)return 0; 

我可以在我的程序中使用它嗎?我不知道Mutex是什麼。

+0

呃... ...最常見的使用情況下爲了這個,我所記得的是一個病毒檢測時被加載的防病毒... –

回答

2

這裏是正在運行的進程的基本枚舉在Windows中:

#define WINVER  0x0500 
#define _WIN32_WINNT 0x0500 
#define PSAPI_VERSION 1 
#include <windows.h> 
#include <tchar.h> 
#include <psapi.h> 
#include <sddl.h> 

void ListProcesses() 
{ 
    DWORD aProcesses[1024], cbNeeded, cProcesses; 
    MEMORYSTATUSEX statex; 

    statex.dwLength = sizeof(statex); 

    ::GlobalMemoryStatusEx(&statex); 

    ::EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded); 
    cProcesses = cbNeeded/sizeof(DWORD); 

    for (size_t i = 0; i < cProcesses; ++i) 
    if(aProcesses[i] != 0) 
     std::cout << "PID: " << aProcesses[i] << ", Name: " << getProcessNameByID(aProcesses[i]) << std::endl; 
} 

您可以使用最終名稱查找與getProcessNameByID做出決定。下面是getProcessPathNameByID代碼:

#include <tchar.h> 

std::string getProcessNameByHandle(HANDLE hProcess) 
{ 
    if (NULL == hProcess) 
    return "<unknown>"; 

    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); 
    HMODULE hMod; 
    DWORD cbNeeded; 

    if (::EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) 
    ::GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR)); 

    return std::string(szProcessName); 
} 

std::string getProcessNameByID(DWORD processID) 
{ 
    HANDLE  hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID); 
    std::string result = getProcessNameByHandle(hProcess); 
    ::CloseHandle(hProcess); 

    return result; 
} 
+0

我很抱歉,但我完全地新到C++。總是使用Java和Eclipse(當需要導入/包含剛剛按下shift + o的東西時),現在我遇到了一些問題,因爲編譯器尖叫幾乎所有的東西都沒有聲明。 Coudl你也幫助我呢? – shym

+0

哦,標準庫頭......添加'#包括'和''頂部的#include ,你需要首先把'getProcessNameByHandle'功能。 –

+0

已經有他們。仍然得到像這樣的錯誤: 'MEMORYSTATUSEX'未在此範圍內聲明| – shym

相關問題