-
함수의 원형
HMODULE GetModuleHandle(LPCTSTR lpModuleName);
함수의 기능
명시된 모듈명칭(lpModuleName)에 해당하는 모듈이 해당 프로세스 주소공간에 연결(mapping)되어 있다면 해당 모듈의 핸들을 반환한다.
함수의 매개변수 설명
lpModuleName
모듈 이름이 명시된 문자열의 포인터이다. (해당 모듈은 .DLL 파일이거나 .EXE 파일이다)
파일 확장자는 생략가능하며 생략했을때는 .DLL 파일로 처리된다. 만약 확장자가 없는 파일이라면 이름의 끝에 마침표를 사용해야 한다. (예, "test.")
파일 이름에 경로를 사용하는 경우에는 반드시 '\'를 사용해야한다. (예,"C:\\test.dll")
명시된 이름은 이 함수를 호출한 프로세스의 주소공간에 연결된 각 모듈의 이름과 비교되어진다.
만약 lpModuleName 포인터의 값으로 NULL을 사용했다면 이 함수를 호출한 프로세스의 핸들값이반환될 것이다. 즉, GetModuleHandle(NULL); 이라고 호출한것은 AfxGetInstanceHandle(); 함수를 호출한것과 동일한 값을 반환한다.
함수의 반환값
이 함수가 성공적으로 완료되었다면 명시된 모듈의 핸들이 반환될 것이다. 만약, 실패했다면 NULL 값이 반환될 것이다. 실패에 대한 좀더 자세한 정보를 얻고 싶다면 GetLastError 함수를 호출하면 된다.
함수 사용시 주의사항
이 함수에 의해서 반환되는 핸들값은 전역적이지 않고 상속도 되지 않기 때문에 다른 프로세스가 이 핸들값을 사용해서는 안된다. 그리고 이 함수는 참고하고자 하는 모듈의 참조개수(reference count)를 증가시키지 않고 핸들값을 반환하기 때문에 실수로 FreeLibrary 함수에 이 핸들을 사용하면 참조개수가 감소하여 해당 DLL 모듈이 해당 프로세스의 주소공간에서 원하지 않는 시점에 해제(unmapping)될수있다.
HANDLE h_load_dll = LoadLibrary("test.dll"); // test.dll 모듈이 해당 프로세스에 연결된다.
HANDLE h_get_dll = GetModuleHandle("test.dll"); // h_get_dll은 h_load_dll과 동일한 값을 가지게 된다.
FreeLibrary(h_get_dll); // test.dll 모듈이 해당 프로세스와 연결이 해제된다.
FreeLibrary(h_load_dll); // 이미 해제된 모듈을 해제로 오류 상황.
함수의 요구사항
Window NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and Later.
Header: Declared in Winbase.h: Include Windows.h.
Library: Use Kernel32.lib.
Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000/XP.
Also supported by Microsoft Layer for Unicode.