오브젝트와 오브젝트 핸들

Programming/API 2015. 6. 3. 15:24

오브젝트와 오브젝트 핸들


윈도우가 관리하는 모든 리소스는 오브젝트이다.


윈도우즈 API를 공부하는 오브젝트라는 용어가 많이 나오게되는데

이 오브젝트라는 것은 예를 들면 윈도우를 만들면 프로세스, 스레드, 윈도우 창, 파일, 펜, 브러쉬등 윈도우가 생성하는 리소스는 모든 것이 오브젝트이며, 핸들이라는 값을 통해서 윈도우가 관리를 하게 된다.


HANDLE은 OS Bit에 따르며 32Bit환경에서는 4Byte, 64Bit환경에서는 8Byte의 값을 가진다.

HANDLE 자체는 VOID형 포인터이고 , 이 값은 사용자가 어떻게 만질 수 있는 것이 아니다.


윈도우에게 객체 생성을 요청하면, 윈도우는 해당 객체를 생성한 뒤에 내부적으로 관리하며 그에 해당하는 HANDLE 값만 넘겨주고 그 객체의 직접적인 접근은 불가능하다.



커널 오브젝트와 유저 오브젝트


일반적인 경우에 커널인지, 유저인지 구분 할 필요성이 없다.

다만 속도와 안전성에 더 신경을 써야 할 경우는 이 객체가 커널 객체인지 유저 객체인지

알고 사용하는 것이 더 튼튼하고 안전한 개발이 될 수 있을 것이다.


윈도우 오브젝트를 생성하는 함수들은 대체적으로 앞에 Create...라는 이름이 붙게되는데

이 함수는 핸들을 리턴하게 된다. 핸들은 HANDLE 일수도 있고, HWND, HPEN, HDC등의 

이름인 경우도 있다.


그런데 함수 인자로 SECURITY_ATTRIBUTES 구조체 인자를 받는다면, 이는 커널 오브젝트라고 볼 수 있다.

이것은 해당 객체에 대한 보안 속성으로 커널 오브젝트 생성시에 객체의 접근 권한에 대한 설정을 해주는 부분이다.  커널 오브젝트의 경우에는 프로세스에 종속적인 객체가 아니므로 타 프로세스에서 접근이 가능하기때문에 이런 접근 권한을 설정할 때 사용된다.


커널 오브젝트의 경우에 특이점은 프로세스에 종속적이지 않기 때문에 커널에서 직접 관리하므로  프로세스가 파괴된다고 해서 무조건 함께 같이 파괴된다는 보장은 없다..


커널 오브젝트는 일반적으로 CloseHandle이라는 함수를 통해서 객체를 삭제하는데 이것은 객체에 대한 접근 카운팅만 조절 할 뿐 우리 맘대로 삭제할 수 없다.


다만 이 커널 객체를 아무도 사용하고 있지 않다면(접근 카운팅이 0이라면) 바로 삭제된다.

커널 객체는 삭제의 권한도 커널에게 있다는 것을 명심하자.

'Programming > API' 카테고리의 다른 글

사용자 정의 데이터  (0) 2015.06.07
윈도우 프로그래밍의 구조  (0) 2015.06.03
윈도우 API  (0) 2015.06.03
윈도우의 메모리 구조  (0) 2015.06.03
WBCS(유니코드) 문자열  (0) 2015.06.01
admin