프로세스 목록 가져오기 및 프로세스 찾기 / 종료시키기
C++ 2009. 6. 19. 15:45 |// 프로세스 찾기
#include <tlhelp32.h>
bool GetProcessModule(DWORD dwPID, char* sProcessName);
bool ProcessFind(char* strProcessName)
{
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE)-1)
return false;
pe32.dwSize = sizeof(PROCESSENTRY32);
//프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다
if (Process32First(hProcessSnap, &pe32))
{
BOOL bCurrent = FALSE;
MODULEENTRY32 me32 = {0};
do
{
bCurrent = GetProcessModule(pe32.th32ProcessID,strProcessName);
if(bCurrent)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
if(hProcess)
{
// 이 주석을 없애면 프로세스를 죽이는것도 가능하다.
//if(TerminateProcess(hProcess, 0))
//{
// unsigned long nCode; //프로세스 종료 상태
// GetExitCodeProcess(hProcess, &nCode);
//}
//printf("process exit\n");
CloseHandle(hProcess);
return true;
}
}
}
while (Process32Next(hProcessSnap, &pe32)); //다음 프로세스의 정보를 구하여 있으면 루프를 돈다.
}
CloseHandle (hProcessSnap);
return false;
}
bool GetProcessModule(DWORD dwPID, char* sProcessName)
{
HANDLE hModuleSnap = NULL;
MODULEENTRY32 me32 = {0};
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == (HANDLE)-1)
return (FALSE);
me32.dwSize = sizeof(MODULEENTRY32);
//해당 프로세스의 모듈리스트를 루프로 돌려서 프로세스이름과 동일하면
//true를 리턴한다.
if(Module32First(hModuleSnap, &me32))
{
do
{
printf("process name : %s\n", me32.szModule);
if( strcmp(me32.szModule, sProcessName) == 0 )
{
CloseHandle (hModuleSnap);
return true;
}
//if(me32.szModule == sProcessName)
//{
// CloseHandle (hModuleSnap);
// return true;
//}
}
while(Module32Next(hModuleSnap, &me32));
}
CloseHandle (hModuleSnap);
return false;
}
----------------- 사용할때 -------------------
// 런처가 돌고 있는지를 판단한다. (제가 한건 해당 프로세스가 돌고 있는지를 찾는 코드로 재사용 했음)
if( ProcessFind("CruiseLauncher.exe") == false )
{
MessageBox(NULL, "CruiseLauncher가 실행중이지 않습니다.", "오류", MB_OK);
exit(0);
}