프로그래밍/C++ Builder

작업 관리자 프로세스 죽이기

Dev-Drake 2019. 7. 16. 16:11
반응형

#include <tlhelp32.h>

 

KillProcessName("프로그램명.exe");

 

void __fastcall TMainFrm::KillProcessName(AnsiString Name)

{

    HANDLE hProcessSnap = NULL;

    BOOL bRet = FALSE;

    PROCESSENTRY32 pe32 = {0};

 

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if(hProcessSnap == (HANDLE)-1)  return;

    pe32.dwSize = sizeof(PROCESSENTRY32);

 

    //프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다

    if(Process32First(hProcessSnap, &pe32))    {

        BOOL bCurrent = FALSE;

        MODULEENTRY32 me32 = {0};

 

        do {

            bCurrent = GetProcessModule(pe32.th32ProcessID, Name);

 

            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);

}

 

char __fastcall TMainFrm::GetProcessModule(DWORD dwPID, AnsiString 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(!strcmp(me32.szModule, sProcessName.c_str()))   {

                CloseHandle(hModuleSnap);

                return true;

            }

        }

 

        while(Module32Next(hModuleSnap, &me32));

    }

 

    CloseHandle (hModuleSnap);

    return false;

}

 

반응형