다음을 통해 공유


GetModuleHandleExW 함수(libloaderapi.h)

지정된 모듈에 대한 모듈 핸들을 검색하고 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 지정하지 않는 한 모듈의 참조 횟수를 증분합니다. 호출 프로세스에서 모듈을 로드해야 합니다.

통사론

BOOL GetModuleHandleExW(
  [in]           DWORD   dwFlags,
  [in, optional] LPCWSTR lpModuleName,
  [out]          HMODULE *phModule
);

매개 변수

[in] dwFlags

이 매개 변수는 다음 값 중 0개 이상일 수 있습니다. 모듈의 참조 수가 증가하면 호출자는 FreeLibrary 함수를 사용하여 모듈 핸들이 더 이상 필요하지 않을 때 참조 수를 줄여야 합니다.

GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS(0x00000004)

lpModuleName 매개 변수는 모듈의 주소입니다.

GET_MODULE_HANDLE_EX_FLAG_PIN(0x00000001)

이 모듈은 FreeLibrary 호출된 횟수에 관계없이 프로세스가 종료될 때까지 로드된 상태로 유지됩니다.

이 옵션은 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 사용할 수 없습니다.

GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT(0x00000002)

모듈의 참조 수는 증가하지 않습니다. 이 옵션은 getModuleHandle동작과 동일합니다. 검색된 모듈 핸들을 FreeLibrary 함수에 전달하지 마세요. 이렇게 하면 DLL의 매핑이 조기에 해제될 수 있습니다. 자세한 내용은 비고를 참조하세요.

이 옵션은 GET_MODULE_HANDLE_EX_FLAG_PIN 사용할 수 없습니다.

[in, optional] lpModuleName

로드된 모듈의 이름(.dll 또는 .exe 파일) 또는 모듈의 주소입니다(dwFlags GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 경우).

모듈 이름의 경우 파일 이름 확장명을 생략하면 기본 라이브러리 확장명 .dll 추가됩니다. 파일 이름 문자열에는 모듈 이름에 확장명 없음을 나타내는 후행 지점 문자(.)가 포함될 수 있습니다. 문자열은 경로를 지정할 필요가 없습니다. 경로를 지정할 때 슬래시(/)가 아닌 백슬라이시(\)를 사용해야 합니다. 이름은 호출 프로세스의 주소 공간에 현재 매핑된 모듈의 이름과 비교됩니다(대/소문자 구분).

이 매개 변수가 NULL이면 함수는 호출 프로세스(.exe 파일)를 만드는 데 사용되는 파일에 대한 핸들을 반환합니다.

[out] phModule

지정된 모듈에 대한 핸들입니다. 함수가 실패하면 이 매개 변수는 NULL.

GetModuleHandleEx 함수는 LOAD_LIBRARY_AS_DATAFILE 플래그를 사용하여 로드된 모듈에 대한 핸들을 검색하지 않습니다. 자세한 내용은 LoadLibraryEx참조하세요.

반환 값

함수가 성공하면 반환 값은 0이 아닌 값입니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 얻으려면 GetLastError참조하세요.

발언

반환된 핸들이 전역적이거나 상속할 수 없습니다. 다른 프로세스에서는 복제하거나 사용할 수 없습니다.

lpModuleName 경로가 포함되지 않고 동일한 기본 이름과 확장명을 가진 로드된 모듈이 두 개 이상 있는 경우 반환될 모듈 핸들을 예측할 수 없습니다. 이 문제를 해결하려면 경로를 지정하거나,병렬 어셈블리를 사용하거나, lpModuleName 매개 변수에서 DLL 이름이 아닌 메모리 위치를 지정할 수 있습니다.

dwFlags GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 포함하는 경우 GetModuleHandleEx 함수는 참조 수를 증가하지 않고 매핑된 모듈에 대한 핸들을 반환합니다. 그러나 이 핸들이 FreeLibrary 함수에 전달되면 매핑된 모듈의 참조 수가 감소합니다. 따라서 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT GetModuleHandleEx 반환된 핸들을 FreeLibrary 함수에 전달하지 마세요. 이렇게 하면 DLL 모듈의 매핑이 조기에 해제될 수 있습니다.

dwFlags GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 포함하는 경우 이 함수는 다중 스레드 애플리케이션에서 신중하게 사용해야 합니다. 이 함수가 핸들을 반환하는 시간과 사용되는 시간 사이에 모듈 핸들이 유효한 상태로 유지된다는 보장은 없습니다. 예를 들어 스레드는 모듈 핸들을 검색하지만 핸들을 사용하기 전에 두 번째 스레드가 모듈을 해제합니다. 시스템에서 다른 모듈을 로드하는 경우 최근에 해제된 모듈 핸들을 다시 사용할 수 있습니다. 따라서 첫 번째 스레드는 의도한 것과 다른 모듈에 대한 핸들을 갖습니다.

이 함수를 사용하는 애플리케이션을 컴파일하려면 _WIN32_WINNT 0x0501 이상으로 정의합니다. 자세한 내용은 Windows 헤더사용하는 참조하세요.

메모

libloaderapi.h 헤더는 GetModuleHandleEx 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입대한 규칙을 참조하세요.

요구 사항

요구
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 libloaderapi.h(Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

Dynamic-Link 라이브러리 함수

freeLibrary

GetModuleFileName

LoadLibrary

LoadLibraryEx

VBS enclave에서 사용할 수 있는 Vertdll API