API

LoadLibrary와 GetModuleHandle 및 FreeLibrary

디버그정 2009. 6. 24. 11:28
LoadLibrary와 GetModuleHandle 둘다 모두 모듈의 핸들값을 구해준다.

다른 점은 LoadLibrary는 현재 해당 모듈이  메모리에 매핑되어 있는지 확인해 보고,
매핑되어 있으면 다시 메모리에 로딩 및 매핑할 필요가 없으므로 바로 모듈의 시작주소를 리턴해주고,
존재하지 않는 경우 비로소 메모리에 로딩 및 매핑시킨다....
이름 그대로 라이브러리를 로딩하는 것이 주목적이다.

이에 반해 GetModuleHandle는 LoadLibrary와 같은 능동적인 동작은 하지 않고
다만 현재 메모리에 매핑되어 있는 것중  찾을 뿐이다. 그러므로 해당 모듈이 존재하지 않으면
실패할 것이다. 역시 이름에서 알 수 잇듯이 모듈의 핸들을 얻는게 주 목적이다.

로딩된 모듈의 해제는  참조카운트(reference count)로 관리한다.
가령 처음에 LoadLibrary로 로딩및 매핑시 참조카운터가 1이되고,,, 나중에 LoadLibrary를 호출하면
참조카운터 1증가해 2가 된다..... LoadLibrary는 호출할때마다 1씩 증가한다... 그러므로 사용후
이제 더이상 필요없는 경우 FreeLibrary를 호출하는 습관을 들이는게 좋다. 이 FreeLibrary라는 api는
위 참조카운트를 1씩 줄이며 0이 된경우 프로세스에서 해당 모듈을 해제하는 기능을 한다.

GetModuleHandle는 참조카운터와 전혀 상관없다. 그러므로 안써도 될 FreeLibrary를 써서
해당 모듈을 메모리에서 내려버리는 어리석은 짓을 하지 말자...;;;

////////////// 결론 //////////////////
GetModuleHandle는 단지 존재하는 모듈의 핸들값을 알아올 뿐이다.
단지 모듈의 핸들값을 알아낼 목적이라면 LoadLibrary후 반드시 FreeLibrary를 해주자.
GetModuleHandle을 사용하는 경우 절대 FreeLibrary를 하지말자.