'Kill Process'에 해당되는 글 2건

  1. 2008.12.01 [API] 부모 프로세서 죽이기
  2. 2008.12.01 [API] Kill Process
Programming/Win32 API2008. 12. 1. 15:44

데브피아의 이승규 님의 글을 허락도 없이 퍼왔습니다. (__)ㅋ

---------------------------------------------------------


쩝...유닉스랑은 부모와 자식관계가 참 거시기 하네요... 그냥 함 만들어 봤습니다. GetCurrentProcessId같은것들은 있는데 왜 이건 안만들어서 절 귀찮게 하는지 모르겠네요..-_-;
 
#include <Tlhelp32.h>
 
// 부모 프로세스 아이디
DWORD GetParentProcessId()
{
    HANDLE          hProcessSnap    = NULL;
    PROCESSENTRY32  pe32            = {0};
    DWORD           pid             = GetCurrentProcessId();
   
 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)   {
        return FALSE;
    }
 
    pe32.dwSize = sizeof(PROCESSENTRY32);
 
    if (Process32First(hProcessSnap, &pe32))    {
        DWORD Code = 0;
        do{        
            if(pe32.th32ProcessID != pid) {
                continue;
            }           
            CloseHandle (hProcessSnap);
            return pe32.th32ParentProcessID;
        } while (Process32Next(hProcessSnap, &pe32));
    }
    CloseHandle (hProcessSnap);
    return 0;
}
 
// 부모프로세스 핸들
HANDLE GetParentProcessHandle()
{
    DWORD       dwParentProcessId;
    dwParentProcessId = GetParentProcessId();
    return OpenProcess (PROCESS_ALL_ACCESS, FALSE, dwParentProcessId);          
}
 
// 부모프로세스 끝나기 기다리기
void WaitForParentProcess(DWORD dwTimeout)
{
    HANDLE hParentProcess;
 
    hParentProcess = GetParentProcessHandle();
 
    if ( hParentProcess != NULL )
    {
        WaitForSingleObject(hParentProcess, dwTimeout);
        CloseHandle(hParentProcess);
 
        return ;
    }
}
 
// 부모 프로세스 죽이기
void TerminateParentProcess()
{
    HANDLE hParentProcess;
 
    hParentProcess = GetParentProcessHandle();
 
    if ( hParentProcess != NULL )
    {
        if (TerminateProcess(hParentProcess, 0))
        {
            CloseHandle(hParentProcess);
            return;
        }
 
        return ;
    }
}

주석으로 막아 놓은 것은 찾고자 하는 프로세스의 이름으로 프로세스를 찾아 그것의 상태를 보고 싶을때 쓸수 있습니다


SendMessageTimeout 대신 IsHungAppWindow라는 함수를 쓸 수 있다는 글을 어느 분이 쓰신것 같은데 저는 그 함수가 어느 헤더에 정의 되어져 있는지 알 수 가 없더군요

혹시 아시는 분 계시면 답글 달아 주시면 감사하겠습니다


위의 루틴은 비교적 쉬우니까 초보 분들도 이해 하시는데 어려움이 없을것 같네요


코딩은 쉽게 쉽게 짜여 졌으면 하는 바램으로 글을 올립니다

주석으로 막아 놓은 것은 찾고자 하는 프로세스의 이름으로 프로세스를 찾아 그것의 상태를 보고 싶을때 쓸수 있습니다


---------------------------------------------------------------------------------------

좋음 2004-06-17 13:49:00 user32.dll에 있는 함수죠... 문서화 되지 않은 함수입니다. 따라서 문서에 나와있지 않고
헤더에도 없죠... BOOL WINAPI IsHungAppWindow(HWND hwnd); 입니다. 직접 LoadLibrary해서
사용하시면 됩니다.
신영진
(hacsyj)
궁금 2004-06-18 09:01:00 문서화 되지 않은 함수인가요?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Windows/WindowReference/WindowFunctions/IsHungAppWindow.asp
배토
(batmask)
좋음 2004-06-18 10:35:00 msdn에서 발췌
Function Information
Header Declared in Winuser.h, include Windows.h
Import library User32.lib
Minimum operating systems Windows 2000
심준석
(stonesim@hotmail.com)
좋음 2004-07-08 09:27:00 CreateToolhelp32Snapshot 으로 열린 핸들은 CloseToolhelp32Snapshot을 이용해
닫으라는군요. CloseHandle을 쓰면 메모리 leak이 있답니다. ^^
CloseHandleh(ProcessSnap) => CloseToolhelp32Snapshot(ProcessSnap)
배토
(batmask)
좋음 2004-07-13 16:45:00 CloseToolhelp32Snapshot은 VC7에서는 찾을 수가 없습니다. 김회대
(k5022)
좋음 2004-07-13 16:50:00 IsHungAppWindow은 다음과 같은 형식으로 사용하면 됩니다.
typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW) (HWND);

PROCISHUNGAPPWINDOW IsHungAppWindow;
HMODULE hUser32 = GetModuleHandle("user32");
IsHungAppWindow = (PROCISHUNGAPPWINDOW)GetProcAddress(hUser32,"IsHungAppWindow");
김회대
(k5022)


Posted by skensita
Programming/Win32 API2008. 12. 1. 15:42

프로세스를 죽이는 방법은 여러가지가 있지만 남의 프로그램을 Class Name, Windows Name으로

Process Id를 얻어내어 프로세스를 Kill 시키는 방법을 기술한다.


참고로 Process Id와 Process Name 은 Spy++ 로 쉽게 확인 할수 있다.

또한 다이얼로그 기반 프로세스는 Windows Name이 없기 때문에 Null값을 입력하면 된다.


//먼저 핸들값을 얻어낸다.

hwnd = FindWindow(TEXT("Class Name"),TEXT("Windows Name"));

if(hwnd == NULL)
 {
  return false;

 }


//핸들값을 통해 ProecssId를 도출한다.

DWORD dwProcessId = NULL;
 GetWindowThreadProcessId( hwnd,    &dwProcessId);
 if(dwProcessId == NULL)
 {
    return false;
 }


HANDLE  process;
 DWORD  dwError;


//얻어진 ProcessId로 프로세서를 연다.
 process = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId );
 dwError = GetLastError();
 if(process == NULL)
 {
    if(dwError == ERROR_INVALID_PARAMETER) // already terminated.
       return true;

 
  return false;
 }


//열려진 Process핸들값으로 해당 프로세서를 종료한다.
 if(!TerminateProcess(process, (UINT)-1))
  printf("KillProcess: TerminateProcess returned false. PID = %u", id);

 CloseHandle(process);
 return true;



꼬리에 꼬리를 무는 식으로 프로그램이 짜여져 있다.

이런것들이 노가다성 작업으로 느껴지기도한다.

Posted by skensita