GSI

'Process32Next'에 해당되는 글 1건

  1. 2009.06.19 프로세스 목록 가져오기 및 프로세스 찾기 / 종료시키기

// 프로세스 찾기
#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);
 }

Posted by gsi
: