블로그 이미지
Terapi

calendar

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
2008.05.30 16:49 Softwere/sample code
HWND와 HINSTANCE의 구조체 내용을 보시면 가지는 속성들이 전혀 다릅니다.

HWND는 윈도우 자체에 대한 정보를 가지는 것이고,
HINSTANCE는 현재 실행중인 인스턴스에 관한 정보를 가지고 있습니다.
인스턴스는 운영체제 전체에서 유일한 번호를 가지므로(실행중인 창들이라고 보면되죠)
HWND를 가지고 인스턴스를 구할순 없지만 HINSTANCE를 가지고 있으면
HWND에 관한 내용들을 구할수 있습니다.

출처: http://blog.naver.com/1981shoo/100012046351
 
 
 

혹자는 이렇게 말한다

HINSTANCE는 프로그램을 구별하기 위한 핸들이라고 하지만 아니다

HINSTANCE는 프로그램 코드를 담고 있는 모듈에 대한 핸들이다. , 프로그램이 수행되려면, 프로그램 코드를 담고 있는 파일을 메모리의 특정 영역에 올려서 명령을 하나씩 읽어가면서 수행할 수 있도록 준비해 놓아야 한다. 이렇게 메모리에 올려진 프로그램 코드 덩어리를 윈도우에서 관리하기 위해서 일종의 고유 식별 번호를 부여하는데, 이것이 인스턴스핸들, HINSTANCE입니다. 기본적으로 프로세스를 실행하는 실행파일의 코드를 메모리에 올려놓은 모듈이 하나 있어야 하므로, 실행파일의 모듈에 대한 인스턴스 핸들을 OS가 어플리케이션에 WinMain의 인자로 넘겨주는 것이다.

 

한 프로세스가 여러개의 모듈을 로딩하여 프로그램을 실행하고 있다면 하나의 프로그램이 여러개의 인스턴스 핸들을 할당받아 쓰고 있을 수가 있다. (물론 한 개의 모듈을 여러 프로세스가 공유하고 있을 수도 있습니다) 대표적인 예가 바로 IE입니다. 간단하게, DLL파일 한개를 쓸 때마다 이 DLL모듈에 대한 인스턴스 핸들이 한개씩 생긴다고 보시면 됩니다. 물론 DLL이 한번 로딩되면 다른 프로그램 사이에서 공유된다는 점은 알고 계시리라 믿는다.

 

한개의 프로그램에서 HINSTANCE가 한 개만 있는 것이 아니며, 또한 하나의 인스턴스핸들이 한개의 프로그램에만 종속되는 것이 아니므로, 어떤 프로그램의 출력 대상을 지정하는 데에는 부적절하다는 점을 알 수 있다. 물론, 인스턴스 핸들은 애초부터 화면 출력을 고려하여 만들어진 식별자는 아니다. 인스턴스 핸들은 단지 프로그램 코드 덩어리를 관리하기 위해 만들어진 리소스이다.

 

 

윈도우라는 OS에서 화면 출력을 위해 관리하는 리소스가 바로 윈도우핸들이다.

MSN메신저등을 보시면 알겠지만, 하나의 프로그램이 하나의 창을 사용한다는 보장이 없습니다. 오히려 99.99%의 프로그램은 한 개 이상의 윈도우로 구성되어 있습니다. 지금 쓰고 계실 것으로 추정되는 IE역시  메뉴바, 툴바, 하단 상태바, 주소창 등등이 모두 별개의 윈도우입니다. 물론 가장 바깥쪽의 프레임 윈도우와, 내부에 웹문서를 보여주는 클라이언트 윈도우도 따로 존재합니다. , 한 프로그램의 윈도우가 겉보기에는 단일한 대상 영역으로 보일지라도, 실제로는 구성요소별로 분리하여 별개의 윈도우로 만들어 각 윈도우는 자기 자신이 맡은 부분에 대한 화면 출력과 사용자 입력만을 담당합니다. 자연히 하나의 프로그램에서 사용하는 윈도우핸들, HWND타입의 개체 역시 1개 이상이 될 수밖에 없으며, 이러한 상황에서 특정 위치에 특정한 동작을 수행하기 위해서는 HWND로 대상 영역을 구분할 수밖에 없는 것이죠.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by Terapi

티스토리 툴바