2 min read

WinApi Handle이란

WinApi를 하게 되면 주로 만나는 단어가 Handle이다.

도대체 이건 무엇일까? 라고 책을 봐도 이거에 대해 명확하게 설명이 되어있지 않다.  또한 MSDN에서도 다음과같은 내용말고는 없다.

An object is a data structure that represents a system resource, such as a file, thread, or graphic image. An application cannot directly access object data or the system resource that an object represents

https://docs.microsoft.com/en-us/windows/desktop/sysinfo/handles-and-objects

msdn에 따르면이는 시스템 리소스,파일,그래픽,이미지를 대표하는 구조체이다.

딱히 이말을 들으면 무슨말하는지 이해하기 힘들것이다.

정답을 알려드리기 전에 각 프로세서는 커널영역과 유저영역이 있다. 

유저영역은 우리가 짜는 프로그램이 도는곳이며 커널영역은 말그대로 시스템에 관련된영역이다. 예로 IO 요청과 스레드 생성,소멸 등을 예로 들수 있다.  

이제 대충 유저영역과 커널영역에 대해 알았으니 Handle이라는 주체에 넘어가자.  프로그래머입장에서 커널영역에 메모리를 바로 요청할수 없고 커널의 함수를 사용할수 없다. 하지만 커널의 요청하는 함수는 쓸수 있다. 

대표적으로 다음과같은 winapi 함수들이있다.

CreateThread,createEvent,createMutex 등 이 있다.

이러한 함수들은 말그대로 시스템과 관련된 함수들이다.  이함수들의 반환형은 알다 싶이 Handle이다. 이  Handle은 커널에 요청한 객체의 ID값을 돌려준다. (메모리 주소가 아닙니다.)

그 객체의 ID값이 Handle이라는 것이다. 이는 다음과 같은 그림이 만들어진다.

https://docs.microsoft.com/en-us/windows/desktop/sysinfo/kernel-objects

이에 대해 더 잘알고싶으면 다음과같은 msdn을 참조하자.

https://docs.microsoft.com/en-us/windows/desktop/sysinfo/kernel-objects