기술(Tech, IT)/C++

[C++] GetModuleHandle() 함수

Daniel803 2024. 3. 19. 02:54

GetModuleHandle() 함수는 WIndows의 API로 지정된 모듈을 검색해 반환하는 함수다(모듈의 엔트리 포인트를 반환 - C나 C++에서 main() 또는 WinMain() 함수). Windows에서 모듈이란 실행 파일(.exe) 또는 호출 프로세스의 메모리에 로드된 동적 링크 라이브러리(.dll) 파일을 말한다(쉽게 얘기하면 함수들의 집합 또는 특정 태스크를 처리하기 위한 객). 이 함수는 모듈이 이미 로드돼 있어 메모리에 다시 로드할 필요가 없을 때 작업 수행 시 유용하다. 이 함수는 Windows API의 이부로 Windows 운영 체제에만 해당된다. 크로스 플랫폼 애플리케이션을 개발하는 경우 운영 체제별 세부 사항을 추상화하는 조건부 컴파일 또는 크로스 플랫폼 프레임워크를 사용해야한다.

HMODULE GetModuleHandle(
  LPCSTR lpModuleName
);
  • lpModuleName
    : 핸들이 필요한 모듈 (실행 파일 또는 DLL)의 이름. 이 매개 변수가 NULL인 경우 GetModuleHandle은 호출 프로세스(.exe 파일)를 만드는 데 사용된 파일에 대한 핸들을 반환한다. 대소문자는 구분하지 않는다.
  • 반환 값
    : 함수가 성공적으로 실행되면 반환 값은 지정된 모듈의 핸들이지만 실패 시 NULL이 반환된다. 자세한 에러 정보를 얻으려면 GetLastError() 함수를 호출하면 된다.

아래는 사용시 기억해야할 사항이다.

  • GetModuleHandle()은 모듈의 참조 수를 증가시키지 않는다. LoadLibrary() 와 달리 GetModuleHandle() 은 참조 수에 영향을 주지 않는다. 즉, LoadLibrary() 를 명시적으로 직접 호출하지 않는 한 모듈을 사용하는 동안 다른 스레드에서 모듈을 언로드할 수 있다.

  • 호출 프로세스(calling process)의 메모리에 이미 로드된 모듈 내의 리소스나 함수에 액세스하는 데 사용된다. 다양한 모듈의 기능이나 데이터를 동적으로 쿼리해야 하는 플로그인 시스템이나 모듈식 애플리케이션에 특히 유용하다.

  • DLL로 작업할 때 DLL 자체에 대한 핸들을 가져와야 하는 경우(예: DLL 내에 정의된 리소스나 함수의 주소를 검색하기 위해) DLL 컨텍스트에서 매개 변수로 NULL을 사용하여 GetModuleHandle() 을 호출해 자체 핸들을 가져올 수 있다.

다음은 사실상 모든 Windows 프로세스에 항상 로드되는 모듈인 kernel32.dll 모듈의 핸들을 검새갛기 위해 GetModuleHandle() 을 사용하는 간단한 예제다. 

#include <windows.h>
#include <iostream>

int main() {
    HMODULE hModule = GetModuleHandle(TEXT("kernel32.dll"));
    if (hModule != NULL) {
        std::cout << "Handle for kernel32.dll: " << hModule << std::endl;
    } else {
        std::cout << "Failed to get handle for kernel32.dll" << std::endl;
    }
    return 0;
}

 

참고

- https://m.blog.naver.com/kgg1959/30188560970

https://misterleeee.tistory.com/entry/GetModuleHandle-%EA%B3%BC-Loadlibrary-%EB%8C%80%ED%95%98%EC%97%AC

- https://infos.tistory.com/2115