본문 바로가기
Engineering

[C/C++] ProcessKill

by 투썬 아빠 2009. 7. 31.




특정 프로세스 이름을 가지고 프로세스를 종료하는 방법을 알아보자

#include <Tlhelp32.h>

BOOL ProcessKill(CString 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);
     }
     CloseHandle(hProcess);
    }
   }
  }
  //다음 프로세스의 정보를 구하여 있으면 루프를 돈다.
  while (Process32Next(hProcessSnap, &pe32));
 }

 CloseHandle (hProcessSnap);
 return true;
}

BOOL GetProcessModule(DWORD dwPID, CString 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 {
   if(me32.szModule == sProcessName)
   {
    CloseHandle (hModuleSnap);
    return true;
   }
  }

  while(Module32Next(hModuleSnap, &me32));
 }

 CloseHandle (hModuleSnap);
 return false;
}

위에서 ProcessKill가 말 그대로 인자로 받는 이름을 가진 프로세스를 종료하는 함수이다.

strProcessName에 종료할 프로세스 이름을 넣으면 해당 프로세스가 종료 된다.
위의 예에서는 CString으로 변수를 만들었지만  다른 문자열로 변수를 만들어도 무방하다.
me32.szModuled은  "char szModule[MAX_MODULE_NAME32 + 1]"로 정의 되어있다.


댓글