다음을 통해 공유


FreeLibrary 함수(libloaderapi.h)

로드된 DLL(동적 연결 라이브러리) 모듈을 해제하고 필요한 경우 참조 수를 줄입니다. 참조 수가 0에 도달하면 호출 프로세스의 주소 공간에서 모듈이 언로드되고 핸들이 더 이상 유효하지 않습니다.

구문

BOOL FreeLibrary(
  [in] HMODULE hLibModule
);

매개 변수

[in] hLibModule

로드된 라이브러리 모듈에 대한 핸들입니다. LoadLibrary, LoadLibraryEx,
GetModuleHandle 또는 GetModuleHandleEx 함수는 이 핸들을 반환합니다.

반환 값

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

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 가져오려면 GetLastError 함수를 호출합니다.

설명

시스템은 로드된 각 모듈에 대한 프로세스별 참조 수를 유지 관리합니다. 로드 시간 동적 연결로 인해 프로세스 초기화 시 로드된 모듈의 참조 수는 1개입니다. LoadLibrary를 호출하여 모듈을 로드할 때마다 모듈에 대한 참조 수가 증가합니다. 모듈이 처음으로 로드되고 데이터 또는 이미지 파일로 로드되지 않는 한 LoadLibraryEx 호출에 의해 참조 수가 증가합니다.

모듈에 대해 FreeLibrary 또는 FreeLibraryAndExitThread 함수가 호출될 때마다 참조 수가 감소합니다. 모듈의 참조 수가 0에 도달하거나 프로세스가 종료되면 시스템은 프로세스의 주소 공간에서 모듈을 언로드합니다. 라이브러리 모듈을 언로드하기 전에 시스템에서 모듈의 DllMain 함수(있는 경우)를 호출하여 DLL_PROCESS_DETACH 값을 사용하여 모듈을 프로세스에서 분리할 수 있습니다. 이렇게 하면 라이브러리 모듈에서 현재 프로세스를 대신하여 할당된 리소스를 클린 수 있습니다. 진입점 함수가 반환된 다음 라이브러리 모듈은 현재 프로세스의 주소 공간에서 제거됩니다.

DllMain에서 FreeLibrary를 호출하는 것은 안전하지 않습니다. 자세한 내용은 DllMain의 설명 섹션을 참조하세요.

FreeLibrary를 호출해도 동일한 모듈을 사용하는 다른 프로세스에는 영향을 주지 않습니다.

GetModuleHandle에서 반환된 핸들을 사용하여 FreeLibrary를 호출할 때는 주의해야 합니다. GetModuleHandle 함수는 모듈의 참조 횟수를 증가시키지 않으므로 이 핸들을 FreeLibrary에 전달하면 모듈이 조기에 언로드될 수 있습니다.

실행 중인 DLL을 언로드한 다음 자체적으로 종료해야 하는 스레드는 FreeLibrary 및 ExitThread를 별도로 호출하는 대신 FreeLibraryAndExitThread를 호출해야 합니다. 그렇지 않으면 경합 상태가 발생할 수 있습니다. 자세한 내용은 FreeLibraryAndExitThread의 설명 섹션을 참조하세요.

예제

예제는 Run-Time 동적 연결 사용을 참조하세요.

요구 사항

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

참고 항목

DllMain

동적 연결 라이브러리 함수

FreeLibraryAndExitThread

GetModuleHandle

GetModuleHandleEx

LoadLibrary

런타임 동적 연결