LoadLibraryA 함수(libloaderapi.h)
지정된 모듈을 호출 프로세스의 주소 공간에 로드합니다. 지정된 모듈로 인해 다른 모듈이 로드될 수 있습니다.
추가 로드 옵션은 LoadLibraryEx 함수를 사용합니다.
통사론
HMODULE LoadLibraryA(
[in] LPCSTR lpLibFileName
);
매개 변수
[in] lpLibFileName
모듈의 이름입니다. 라이브러리 모듈(.dll 파일) 또는 실행 모듈(.exe 파일)일 수 있습니다.
지정된 모듈이 실행 가능한 모듈인 경우 정적 가져오기가 로드되지 않습니다. 대신, 모듈은
지정된 이름은 모듈의 파일 이름이며, 모듈 정의(.def) 파일의 LIBRARY 키워드에 지정된 대로 라이브러리 모듈 자체에 저장된 이름과 관련이 없습니다.
문자열이 전체 경로를 지정하는 경우 함수는 해당 경로에서 모듈만 검색합니다.
문자열이 경로 없이 상대 경로 또는 모듈 이름을 지정하는 경우 함수는 표준 검색 전략을 사용하여 모듈을 찾습니다. 자세한 내용은 비고를 참조하세요.
함수가 모듈을 찾을 수 없으면 함수가 실패합니다. 경로를 지정할 때 슬래시(/)가 아닌 백슬라이시(\)를 사용해야 합니다. 경로에 대한 자세한 내용은 파일 또는 디렉터리이름 지정
문자열이 경로 없이 모듈 이름을 지정하고 파일 이름 확장명을 생략하면 함수는 기본 라이브러리 확장명 ".DLL"을 모듈 이름에 추가합니다. 함수가 모듈 이름에 ".DLL"을 추가하지 않도록 하려면 모듈 이름 문자열에 후행 지점 문자(.)를 포함합니다.
반환 값
함수가 성공하면 반환 값은 모듈에 대한 핸들입니다.
함수가 실패하면 반환 값은 NULL입니다. 확장 오류 정보를 얻으려면 GetLastError호출합니다.
발언
DLL 로드 중에 로더가 표시하는 오류 메시지를 사용하거나 사용하지 않도록 설정하려면 SetErrorMode 함수를 사용합니다.
LoadLibrary 사용하여 라이브러리 모듈을 프로세스의 주소 공간에 로드하고 GetProcAddress 사용할 수 있는 핸들을 반환하여 DLL 함수의 주소를 가져올 수 있습니다.
LoadLibrary 사용하여 다른 실행 가능한 모듈을 로드할 수도 있습니다. 예를 들어 함수는 .exe 파일을 지정하여 FindResource
지정된 모듈이 호출 프로세스에 대해 아직 로드되지 않은 DLL인 경우 시스템은 DLL_PROCESS_ATTACH 값으로 DLL의 DllMain 함수를 호출합니다.
모듈 핸들은 전역 또는 상속할 수 없습니다. 한 프로세스에서 LoadLibrary
lpFileName 경로가 없고 동일한 기본 이름과 확장명을 가진 로드된 모듈이 두 개 이상 있는 경우 함수는 먼저 로드된 모듈에 대한 핸들을 반환합니다.
lpFileName 매개 변수에 파일 이름 확장명을 지정하지 않으면 기본 라이브러리 확장명 .dll 추가됩니다. 그러나 파일 이름 문자열에는 모듈 이름에 확장명 없음을 나타내는 후행 지점 문자(.)가 포함될 수 있습니다. 경로를 지정하지 않으면 함수는 로드할 모듈의 기본 이름과 일치하는 로드된 모듈을 검색합니다. 이름이 일치하면 로드가 성공합니다. 그렇지 않으면 함수가 파일을 검색합니다.
검색된 첫 번째 디렉터리가 호출 프로세스를 만드는 데 사용되는 이미지 파일이 포함된 디렉터리입니다(자세한 내용은 CreateProcess 함수 참조). 이렇게 하면 프로세스의 설치된 디렉터리를 PATH 환경 변수에 추가하지 않고도 프로세스와 연결된 프라이빗 DLL(동적 연결 라이브러리) 파일을 찾을 수 있습니다. 상대 경로를 지정하면 전체 상대 경로가 DLL 검색 경로 목록의 모든 토큰에 추가됩니다. 다른 경로를 검색하지 않고 상대 경로에서 모듈을 로드하려면 GetFullPathName 사용하여 비관계형 경로를 가져와서 비관계형 경로로 LoadLibrary 호출합니다. DLL 검색 순서에 대한 자세한 내용은 Dynamic-Link 라이브러리 검색 순서참조하세요.
검색 경로는 SetDllDirectory 함수를 사용하여 변경할 수 있습니다. 이 솔루션은 SetCurrentDirectory 사용하거나 DLL의 전체 경로를 하드 코딩하는 대신 권장됩니다.
경로가 지정되고 애플리케이션에 대한 리디렉션 파일이 있는 경우 함수는 애플리케이션의 디렉터리에서 모듈을 검색합니다. 모듈이 애플리케이션의 디렉터리에 있는 경우 LoadLibrary 지정된 경로를 무시하고 애플리케이션의 디렉터리에서 모듈을 로드합니다. 애플리케이션의 디렉터리에 모듈이 없으면 LoadLibrary 지정된 디렉터리에서 모듈을 로드합니다. 자세한 내용은 동적 링크 라이브러리 리디렉션
경로 사양이 없는 어셈블리 이름으로 LoadLibrary 호출하고 어셈블리가 시스템 호환 매니페스트에 나열되면 호출이 자동으로 side-by-side 어셈블리로 리디렉션됩니다.
시스템은 로드된 모든 모듈에서 프로세스별 참조 횟수를 유지 관리합니다.
LoadLibrary 호출하면 참조 수가 증가합니다. freeLibrary 또는 FreeLibraryAndExitThread 함수를
Windows Server 2003 및 Windows XP: Visual C++ 컴파일러는 스레드 지역 변수인 _declspec(스레드)선언할 수 있는 구문을 지원합니다. DLL에서 이 구문을 사용하는 경우 Windows Vista 이전 버전의 Windows에서 LoadLibrary 사용하여 DLL을 명시적으로 로드할 수 없습니다. DLL이 명시적으로 로드되는 경우 _declspec(스레드)대신 스레드 로컬 스토리지 함수를 사용해야 합니다. 예를 들어 동적 링크 라이브러리스레드 로컬 스토리지를 사용하는
보안 설명
SearchPath 함수를 사용하여 후속 LoadLibrary 호출에 대한 DLL 경로를 검색하지 마세요. SearchPath 함수는 LoadLibrary 다른 검색 순서를 사용하며 BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODESetSearchPathMode 호출하여 명시적으로 사용하도록 설정되지 않는 한 안전한 프로세스 검색 모드를 사용하지 않습니다. 따라서 SearchPathDLL을 검색하는 LoadLibrary 호출을 기반으로 운영 체제 버전을 가정하지 마세요. 애플리케이션이 DLL이 합법적으로 존재하지 않지만 악성 버전의 DLL이 검색 경로에 있는 환경에서 실행 중인 경우 악성 버전의 DLL이 로드될 수 있습니다. 대신 시스템 버전 가져오기
예제
예제는 Run-Time 동적 연결사용하는
메모
libloaderapi.h 헤더는 LOADLibrary를 UNICODE 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입대한
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | libloaderapi.h(Windows.h 포함) |
라이브러리 | Kernel32.lib |
DLL | Kernel32.dll |
참고 항목
FindResource
freeLibrary
GetProcAddress
GetSystemDirectory
GetWindowsDirectory
LoadLibraryEx
LoadResource
동적 연결
SetDllDirectory
SetErrorMode