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