오늘은 작업관리자에서 강제로 프로세스를 종료하는 방법이 있는데 이런 방법을 프로그램을 하는 것에 대해 설명하고자 합니다.
보통 메인 프로그램이 서브프로그램을 강제로 종료시킬 때 sendmessage 을 통해서 종료를 시키게 되는데 해당 프로그램이 lock이 걸렸거나 이벤트를 받지를 못하는 상황이 생겼을 때 위 메세지는 의미가 없게 된다.
그렇기에 강제로 프로세스를 종료를 시켜야 하는데 이에 사용한 함수를 소개 하고자 합니다.
** 소스코드
// CString strProcessName : 프로세스 파일명.확장자
BOOL Util::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;
}
// 위 함수애서 호출되는 것으로 해당 프로세스아이디, 이름이 존재하는지 찾는다.'
// DWORD dwPID : 프로세스아이디
// CString sProcessName : 프로세스파일명.확장자
BOOL Util::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;
}
* 사용법
BOOL ret = m_util.ProcessKill("aaa.exe");
작업관리자에서 보이는 파일명.확장을 인자로 넘기면 됩니다. 대소문자 구분도 하니 보이는 그대로 인자를 넘겨야 합니다.