다음을 통해 공유


LoadLibraryA 함수(libloaderapi.h)

지정된 모듈을 호출 프로세스의 주소 공간에 로드합니다. 지정된 모듈로 인해 다른 모듈이 로드될 수 있습니다.

추가 로드 옵션의 경우 LoadLibraryEx 함수를 사용합니다.

구문

HMODULE LoadLibraryA(
  [in] LPCSTR lpLibFileName
);

매개 변수

[in] lpLibFileName

모듈의 이름입니다. 라이브러리 모듈(.dll 파일) 또는 실행 모듈(.exe 파일)일 수 있습니다. 지정된 모듈이 실행 가능한 모듈인 경우 정적 가져오기가 로드되지 않습니다. 대신, 모듈은 마치 LoadLibraryEx 에서 플래그를 사용하여 로드됩니다 DONT_RESOLVE_DLL_REFERENCES .

지정된 이름은 모듈의 파일 이름이며 library 키워드(keyword) module-definition(.def) 파일에서 지정한 대로 라이브러리 모듈 자체에 저장된 이름과 관련이 없습니다.

문자열이 전체 경로를 지정하는 경우 함수는 해당 경로에서 모듈만 검색합니다.

문자열이 경로 없이 상대 경로 또는 모듈 이름을 지정하는 경우 함수는 표준 검색 전략을 사용하여 모듈을 찾습니다. 자세한 내용은 설명을 참조하세요.

함수가 모듈을 찾을 수 없으면 함수가 실패합니다. 경로를 지정할 때 슬래시(/)가 아닌 백슬라이시(\)를 사용해야 합니다. 경로에 대한 자세한 내용은 파일 또는 디렉터리 이름 지정을 참조하세요.

문자열이 경로 없이 모듈 이름을 지정하고 파일 이름 확장명을 생략하면 함수는 모듈 이름에 기본 라이브러리 확장명 ".DLL"을 추가합니다. 함수가 모듈 이름에 ".DLL"을 추가하지 않도록 하려면 모듈 이름 문자열에 후행 점 문자(.)를 포함합니다.

반환 값

함수가 성공하면 반환 값은 모듈에 대한 핸들입니다.

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

설명

DLL 로드 중에 로더가 표시하는 오류 메시지를 사용하거나 사용하지 않도록 설정하려면 SetErrorMode 함수를 사용합니다.

LoadLibrary 를 사용하여 라이브러리 모듈을 프로세스의 주소 공간에 로드하고 GetProcAddress 에서 DLL 함수의 주소를 가져오는 데 사용할 수 있는 핸들을 반환할 수 있습니다. LoadLibrary 를 사용하여 다른 실행 가능한 모듈을 로드할 수도 있습니다. 예를 들어 함수는 .exe 파일을 지정하여 FindResource 또는 LoadResource에서 사용할 수 있는 핸들을 가져올 수 있습니다. 그러나 LoadLibrary 를 사용하여 .exe 파일을 실행하지 마세요. 대신 CreateProcess 함수를 사용합니다.

지정된 모듈이 호출 프로세스에 대해 아직 로드되지 않은 DLL인 경우 시스템은 DLL_PROCESS_ATTACH 값으로 DLL의 DllMain 함수를 호출합니다. DllMain이TRUE를 반환하면 LoadLibrary는 모듈에 대한 핸들을 반환합니다. DllMainFALSE를 반환하면 시스템은 프로세스 주소 공간에서 DLL을 언로드하고 LoadLibraryNULL을 반환합니다. DllMain에서 LoadLibrary를 호출하는 것은 안전하지 않습니다. 자세한 내용은 DllMain의 설명 섹션을 참조하세요.

모듈 핸들은 전역 또는 상속할 수 없습니다. 한 프로세스에서 LoadLibrary 를 호출해도 다른 프로세스에서 사용할 수 있는 핸들(예: GetProcAddress 호출)이 생성되지 않습니다. 다른 프로세스는 GetProcAddress를 호출하기 전에 모듈에 대해 LoadLibrary를 자체적으로 호출해야 합니다.

lpFileName에 경로가 포함되지 않고 동일한 기본 이름과 확장명을 가진 로드된 모듈이 두 개 이상 있는 경우 함수는 먼저 로드된 모듈에 대한 핸들을 반환합니다.

lpFileName 매개 변수에 파일 이름 확장명을 지정하지 않으면 기본 라이브러리 확장명 .dll 추가됩니다. 그러나 파일 이름 문자열에는 모듈 이름에 확장명 없음을 나타내는 후행 지점 문자(.)가 포함될 수 있습니다. 경로가 지정되지 않은 경우 함수는 로드할 모듈의 기본 이름과 일치하는 기본 이름이 있는 로드된 모듈을 검색합니다. 이름이 일치하면 로드가 성공합니다. 그렇지 않으면 함수는 파일을 검색합니다.

검색된 첫 번째 디렉터리가 호출 프로세스를 만드는 데 사용되는 이미지 파일이 포함된 디렉터리입니다(자세한 내용은 CreateProcess 함수 참조). 이렇게 하면 프로세스의 설치된 디렉터리를 PATH 환경 변수에 추가하지 않고도 프로세스와 연결된 프라이빗 DLL(동적 연결 라이브러리) 파일을 찾을 수 있습니다. 상대 경로를 지정하면 전체 상대 경로가 DLL 검색 경로 목록의 모든 토큰에 추가됩니다. 다른 경로를 검색하지 않고 상대 경로에서 모듈을 로드하려면 GetFullPathName 을 사용하여 비관계형 경로를 가져와서 비관계형 경로로 LoadLibrary 를 호출합니다. DLL 검색 순서에 대한 자세한 내용은 Dynamic-Link 라이브러리 검색 순서를 참조하세요.

SetDllDirectory 함수를 사용하여 검색 경로를 변경할 수 있습니다. 이 솔루션은 SetCurrentDirectory 를 사용하거나 DLL에 대한 전체 경로를 하드 코딩하는 대신 권장됩니다.

경로가 지정되고 애플리케이션에 대한 리디렉션 파일이 있는 경우 함수는 애플리케이션의 디렉터리에서 모듈을 검색합니다. 모듈이 애플리케이션의 디렉터리에 있는 경우 LoadLibrary 는 지정된 경로를 무시하고 애플리케이션의 디렉터리에서 모듈을 로드합니다. 애플리케이션의 디렉터리에 모듈이 없는 경우 LoadLibrary 는 지정된 디렉터리에서 모듈을 로드합니다. 자세한 내용은 동적 링크 라이브러리 리디렉션을 참조하세요.

경로 사양이 없는 어셈블리 이름으로 LoadLibrary 를 호출하고 어셈블리가 시스템 호환 매니페스트에 나열되면 호출이 자동으로 병렬 어셈블리로 리디렉션됩니다.

시스템은 로드된 모든 모듈에서 프로세스별 참조 횟수를 유지 관리합니다. LoadLibrary를 호출하면 참조 수가 증가합니다. FreeLibrary 또는 FreeLibraryAndExitThread 함수를 호출하면 참조 수가 감소합니다. 참조 수가 0에 도달하거나 프로세스가 종료되는 경우(참조 수에 관계없이) 모듈을 언로드합니다.

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를 호출하여 명시적으로 사용하도록 설정하지 않는 한 안전한 프로세스 검색 모드를 사용하지 않습니다. 따라서 SearchPath 는 먼저 사용자의 현재 작업 디렉터리에서 지정된 DLL을 검색할 가능성이 높습니다. 공격자가 악성 버전의 DLL을 현재 작업 디렉터리에 복사한 경우 SearchPath 에서 검색한 경로는 악의적인 DLL을 가리킵니다. 그러면 LoadLibrary 가 로드됩니다.

DLL을 검색하는 LoadLibrary 호출을 기반으로 운영 체제 버전을 가정하지 마세요. 애플리케이션이 DLL이 합법적으로 존재하지 않지만 악성 버전의 DLL이 검색 경로에 있는 환경에서 실행 중인 경우 악성 버전의 DLL이 로드될 수 있습니다. 대신 시스템 버전 가져오기에 설명된 권장 기술을 사용합니다.

예제

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

참고

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

요구 사항

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

참고 항목

DllMain

동적 링크 라이브러리 함수

FindResource

FreeLibrary

GetProcAddress

GetSystemDirectory

GetWindowsDirectory

LoadLibraryEx

LoadResource

런타임 동적 연결

SetDllDirectory

SetErrorMode