본문 바로가기
C++ 200제/코딩 IT 정보

윈도우 핸들 : 프로세스 Windows Handle 설명 (hinstance 등)

by vicddory 2017. 3. 24.


페졸드 형님의 책에 나온 윈도우 핸들(windows handle)입니다. 바로 아래는 식별자와 의미를 나타냅니다.


HINSTANCE - '인스턴스(instance)' 핸들(프로그램 자체)

HWND - 윈도우 핸들

HDC - 디바이스 컨텍스트(device context) 핸들


핸들은 빈번하게 사용되며, 대표적으로 HICON(아이콘 핸들), HCURSOR(마우스 커서 핸들), HBRUSH(그래픽 브러쉬 핸들)이 존재합니다.


  • 핸들은 단순한 숫자(흔히 32비트 크기)로서 객체를 참조.
  • 윈도우즈의 핸들은 C언어나 MS-DOS 프로그래밍의 파일 핸들과 유사.
  • 프로그램은 거의 항상 윈도우즈 함수를 호출함으로써 핸들을 얻음.
  • 프로그램에서 다른 윈도우즈 함수를 호출할 때 객체를 참조하기 위해 이 핸들을 이용하지만, 핸들의 실제 값은 프로그램에 중요치 않음.
  • 프로그램에 핸들을 넘겨준 윈도우즈 모듈(Windows module)은 핸들을 이용하여 해당 객체를 참조하는 방법을 안다.

그리고, 32비트 윈도우즈 이전엔 WinMain()의 첫 번째 매개변수는 종종 인스턴스 핸들(instance handle)이라 합니다.


윈도우즈 프로그래밍에서 윈도우 핸들(handle)은 애플리케이션이 무언가를 식별하기 위해 사용하는 단순한 숫자입니다. WinMain()에 사용되는 핸들은 프로그램을 유일하게 식별합니다. 때로 인스턴스 핸들은 다른 윈도우즈 함수를 호출할 때 인자로 사용되기도 합니다.


초창기 윈도우즈에서는 사용자가 같은 프로그램을 두 번 이상 실행하면 해당 프로그램의 인스턴스가 여러 개 생성되었습니다. 한 프로그램의 모든 인스턴스는 프로그램 코드와 더불어, 메뉴나 대화상자 템플릿 리소스와 같은 읽기 전용(read-only) 데이터를 공유하였습니다.



프로그램 실행 시 WinMain()의 두 번째 매개변수인 hPrevInstance를 이용하면 이미 다른 인스턴스가 실행 중인지를 판단할 수 있었습니다.


만약 다른 인스턴스가 실행 중이라면 이전 인스턴스의 일부 데이터를 자신의 데이터 영역(data area)으로 가져옴으로써 일부 작업을 생략할 수 있었습니다. 현재는 이러한 개념을 더이상 사용하지 않습니다.


정리해보면, HANDLE은 Windows(OS) 커널이 관리하는 리소스들의 토큰(token)을 의미합니다. 이때의 핸들은 Window(창), 파일(.exe) 기타 등등 모든 것을 뜻합니다. 코딩 시에는 아래처럼 핸들을 이용해 클래스(window)의 객체를 만들어 사용할 수도 있습니다.


// MFC C# 예제
// 프로세스 ID에서 윈도우 핸들 얻기
// 최상위 창을 열거하여 프로세스 ID가 일치하는 녀석의 HWND 반환
// 같은 프로세스 ID로 최상위 창이 여러개 있을 경우
// 어떻게 되든 그건 모르겠다

HWND GetWindowHandle( // 반환값: 성공시 HWND, 실패시 NULL
  const DWORD TargetID) // 프로세스 ID
{
  HWND hWnd = GetTopWindow(NULL);
  do {
    if(GetWindowLong( hWnd, GWL_HWNDPARENT) != 0 || !IsWindowVisible( hWnd))
      continue;
    DWORD ProcessID;
    GetWindowThreadProcessId( hWnd, &ProcessID);
    if(TargetID == ProcessID)
      return hWnd;
  } while((hWnd = GetNextWindow( hWnd, GW_HWNDNEXT)) != NULL);

  return NULL;
}


C#에서는 윈도우 핸들을 속성값으로 활용합니다. 관련된 프로세스가 시작되면, 운영체제(OS)가 프로세스에 할당된 핸들, 시스템을 활용하여 프로세스 속성을 계속 추적합니다.


댓글