본문 바로가기

[PROGRAMMING]/▶WIN32 API

프로세스 인스턴스 핸들

모든 실행파일과 DLL들은 Process의 메모리상에 Load 될 때 고유의 Instance Handle을 OS로 부터 할당 받아서 실행된다.
그래서 WinMain의 첫번째 매개변수인 hInstanceExe를 통해서 전달받는 것이다.
이 Instance Handle은 여러 용도로 사용되는데 그중에 하나가 Resource를 Load하여 사용할 때 이다.

예를 들면 LoadIcon, LoadString 등이 이에 해당된다.
이 Instance Handle, 즉 hInstanceExe의 값은 OS가 Process의 메모리 주소 공간상에 실행파일을 Load할
시작 메모리 주소다
. 이 주소를 알아 낼수 있는 API가 있다.

HMODULE GetModuleHandle(PCTSTR pszModule);

이 함수의 인자로 실행파일이나 DLL파일명을 문자열로 파라미터로 넣고 실행하면 해당 파일의 시작주소를
반환한다.

또한 HMODULE과 HINSTANCE는 동일한 의미이다.(16비트 윈도우에서 구분되었지만 지금은 혼용)

DWORD GetModuleFileName (HMODULE hInstModule, PTSTR pszPath, DWORD cchPath);

 

인스턴스 = 실행중인 프로그램 하나를 칭함.

윈도우즈 시스템은 멀티태스킹 시스템이다. 시스템상에서 같은 프로그램이 여러개가 실행이 될 수 있으며, 실행됬던 프로그램이 다시 실행될 수 있다.

이때 실행되고 있는 각각의 프로그램을 프로그램 인스턴스라고 한다.

EX)메모장이 각각의 프로그램으로 두번 실행되었을 경우 운영체제는 각각 다른 메모리를 사용하는 별개의 프로그램으로 인식한다.

각 메모장은 서로다른 인스턴스 핸들을 가지며 운영체제는 이 인스턴스 핸들값으로 프로그램을 구별한다.


hInstance의 값은?

WinMain의 hInstance 매개변수의 실제 값
: 시스템이 프로세스의 메모리 주소 공간 상에 실행 파일을 로드할 시작 메모리 주소

- 예를 들어, 시스템이 실행 파일을 열어 그 내용을 0x00400000에 로드하면, hInstance 값은 0x00400000
- 실행 파일이 로드될 시작 주소는 링커에 의해 결정
- 마이크로소프트 링커의 경우 /BASE:address 옵션을 사용하여 시작 주소를 변경
- Visual Studio의 링커는 윈도우98에서 실행 파일을 로드할 수 있는 가장 하단의 메모리 주소가 0x0040000이었기 때문에 지금도 0x00400000을 기본 시작 주소로 사용

출처 : http://www.cyworld.com/del4you/3274054

출처 : http://codecrue.egloos.com/1331353

아래는 핸들에대해 정리를 잘해놓은 블로그입니다.

http://ezbeat.tistory.com/261