본문 바로가기
Programming/Tips(C++,C#)

MFC에서 프로세스 검색및 죽이기

by 곰네Zip 2008. 6. 15.
출처 블로그 > Let's Shoveling
원본 http://blog.naver.com/may30jo/70018616184

/* 프로세스 이름으로 프로세스 죽이는 함수 */
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
       {
         // 모듈을 검색.. 실행파일이 길면 pe32.szExeFile 이걸로 확인불가??
           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;
}

/////////////////////////////////////////////////////////////////////////////////
이걸 잘 활용하면 프로세스 중복실행도 방지할수 있다 ㅋㅋㅋ

반응형

댓글