그래서 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
아래는 핸들에대해 정리를 잘해놓은 블로그입니다.