LoadLibraryExA 함수(libloaderapi.h)

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

구문

HMODULE LoadLibraryExA(
  [in] LPCSTR lpLibFileName,
       HANDLE hFile,
  [in] DWORD  dwFlags
);

매개 변수

[in] lpLibFileName

로드할 모듈의 파일 이름을 지정하는 문자열입니다. 이 이름은 library 키워드(keyword) 모듈 정의(.def) 파일에 지정된 대로 라이브러리 모듈 자체에 저장된 이름과 관련이 없습니다.

모듈은 라이브러리 모듈(.dll 파일) 또는 실행 파일 모듈(.exe 파일)일 수 있습니다. 지정된 모듈이 실행 가능한 모듈인 경우 정적 가져오기가 로드되지 않습니다. 대신 모듈은 DONT_RESOLVE_DLL_REFERENCES 지정된 것처럼 로드됩니다. 자세한 내용은 dwFlags 매개 변수를 참조하세요.

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

문자열이 정규화된 경로를 지정하는 경우 함수는 해당 경로에서 모듈만 검색합니다. 경로를 지정할 때 슬래시(/)가 아닌 백슬라이시(\)를 사용해야 합니다. 경로에 대한 자세한 내용은 이름 지정 파일, 경로 및 네임스페이스를 참조하세요.

문자열이 경로 없이 모듈 이름을 지정하고 로드된 모듈이 둘 이상의 기본 이름과 확장명을 갖는 경우 함수는 먼저 로드된 모듈에 대한 핸들을 반환합니다.

문자열이 경로 없이 모듈 이름을 지정하고 같은 이름의 모듈이 아직 로드되지 않았거나 문자열이 상대 경로가 있는 모듈 이름을 지정하는 경우 함수는 지정된 모듈을 검색합니다. 또한 함수는 지정된 모듈을 로드하면 시스템에서 다른 연결된 모듈(즉, 모듈에 종속성이 있는 경우)을 로드하는 경우 모듈을 검색합니다. 검색되는 디렉터리와 검색되는 순서는 지정된 경로 및 dwFlags 매개 변수에 따라 달라집니다. 자세한 내용은 설명 부분을 참조하세요.

함수가 모듈 또는 해당 종속성 중 하나를 찾을 수 없는 경우 함수가 실패합니다.

hFile

이 매개 변수는 나중에 사용하도록 예약되어 있습니다. NULL이어야 합니다.

[in] dwFlags

모듈을 로드할 때 수행할 작업입니다. 플래그가 지정되지 않은 경우 이 함수의 동작은 LoadLibrary 함수의 동작과 동일합니다. 이 매개 변수는 다음 값 중 하나일 수 있습니다.

의미
DONT_RESOLVE_DLL_REFERENCES
0x00000001
이 값을 사용하고 실행 모듈이 DLL인 경우 시스템은 프로세스 및 스레드 초기화 및 종료를 위해 DllMain 을 호출하지 않습니다. 또한 시스템은 지정된 모듈에서 참조하는 추가 실행 모듈을 로드하지 않습니다.
참고 이 값을 사용하지 마세요. 이전 버전과의 호환성을 위해서만 제공됩니다. DLL의 데이터 또는 리소스에만 액세스하려는 경우 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 또는 LOAD_LIBRARY_AS_IMAGE_RESOURCE 또는 둘 다를 사용합니다. 그렇지 않으면 LoadLibrary 함수를 사용하여 라이브러리를 DLL 또는 실행 가능한 모듈로 로드합니다.
 
LOAD_IGNORE_CODE_AUTHZ_LEVEL
0x00000010
이 값을 사용하는 경우 시스템에서 AppLocker 규칙을 검사 않거나 DLL에 소프트웨어 제한 정책을 적용하지 않습니다. 이 작업은 로드되는 DLL에만 적용되며 해당 종속성에는 적용되지 않습니다. 이 값은 설치 중에 추출된 DLL을 실행해야 하는 설치 프로그램에서 사용하는 것이 좋습니다.

Windows Server 2008 R2 및 Windows 7: KB2532445 설치된 시스템에서 호출자는 "LocalSystem" 또는 "TrustedInstaller"로 실행되어야 합니다. 그렇지 않으면 시스템에서 이 플래그를 무시합니다. 자세한 내용은 의 도움말 및 지원 기술 자료에서 https://support.microsoft.com/kb/2532445"Windows 7 또는 Windows Server 2008 R2를 실행하는 컴퓨터에서 Office 매크로를 사용하여 AppLocker 규칙을 우회할 수 있습니다."를 참조하세요.

Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP: AppLocker는 Windows 7 및 Windows Server 2008 R2에서 도입되었습니다.

LOAD_LIBRARY_AS_DATAFILE
0x00000002
이 값을 사용하는 경우 시스템은 호출 프로세스의 가상 주소 공간에 마치 데이터 파일인 것처럼 파일을 매핑합니다. 매핑된 파일을 실행하거나 실행하기 위해 준비하는 작업은 수행되지 않습니다. 따라서 이 DLL을 사용하여 GetModuleFileName, GetModuleHandle 또는 GetProcAddress 와 같은 함수를 호출할 수 없습니다. 이 값을 사용하면 쓰기가 읽기 전용 메모리에 액세스 위반이 발생합니다. DLL을 로드하려는 경우에만 이 플래그를 사용하여 메시지 또는 리소스를 추출합니다.

이 값은 LOAD_LIBRARY_AS_IMAGE_RESOURCE 사용할 수 있습니다. 자세한 내용은 설명 부분을 참조하세요.

LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE
0x00000040
DLL 파일이 호출 프로세스에 대한 단독 쓰기 액세스 권한으로 열려 있다는 점을 제외하고 LOAD_LIBRARY_AS_DATAFILE 유사합니다. 다른 프로세스는 사용 중인 동안 쓰기 액세스를 위해 DLL 파일을 열 수 없습니다. 그러나 DLL은 다른 프로세스에서 계속 열 수 있습니다.

이 값은 LOAD_LIBRARY_AS_IMAGE_RESOURCE 사용할 수 있습니다. 자세한 내용은 설명 부분을 참조하세요.

Windows Server 2003 및 Windows XP: 이 값은 Windows Vista까지 지원되지 않습니다.

LOAD_LIBRARY_AS_IMAGE_RESOURCE
0x00000020
이 값을 사용하는 경우 시스템은 파일을 프로세스의 가상 주소 공간에 이미지 파일로 매핑합니다. 그러나 로더는 정적 가져오기를 로드하거나 다른 일반적인 초기화 단계를 수행하지 않습니다. DLL을 로드하려는 경우에만 이 플래그를 사용하여 메시지 또는 리소스를 추출합니다.

애플리케이션이 이미지의 메모리 내 레이아웃을 갖는 파일에 의존하지 않는 한 이 값은 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 또는 LOAD_LIBRARY_AS_DATAFILE 함께 사용해야 합니다. 자세한 내용은 주의 섹션을 참조하세요.

Windows Server 2003 및 Windows XP: 이 값은 Windows Vista까지 지원되지 않습니다.

LOAD_LIBRARY_SEARCH_APPLICATION_DIR
0x00000200
이 값을 사용하는 경우 애플리케이션의 설치 디렉터리에서 DLL 및 해당 종속성을 검색합니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH 함께 사용할 수 없습니다.

Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다.

Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다.

LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
0x00001000
이 값은 LOAD_LIBRARY_SEARCH_APPLICATION_DIR, LOAD_LIBRARY_SEARCH_SYSTEM32LOAD_LIBRARY_SEARCH_USER_DIRS 조합입니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH 함께 사용할 수 없습니다.

이 값은 애플리케이션이 DLL 검색 경로에 포함해야 하는 권장되는 최대 디렉터리 수를 나타냅니다.

Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다.

Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다.

LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
0x00000100
이 값을 사용하는 경우 DLL이 포함된 디렉터리가 DLL의 종속성을 검색하는 디렉터리 목록의 시작 부분에 일시적으로 추가됩니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다.

lpFileName 매개 변수는 정규화된 경로를 지정해야 합니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH 함께 사용할 수 없습니다.

예를 들어 Lib2.dll C:\Dir1\Lib1.dll 종속성인 경우 이 값으로 Lib1.dll 로드하면 시스템에서 C:\Dir1에서만 Lib2.dll 검색합니다. C:\Dir1의 Lib2.dll DLL 검색 경로의 모든 디렉터리를 검색하려면 이 값을 LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 결합합니다.

Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다.

Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다.

LOAD_LIBRARY_SEARCH_SYSTEM32
0x00000800
이 값을 사용하면 %windows%\system32에서 DLL 및 해당 종속성을 검색합니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH 결합할 수 없습니다.

Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다.

Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다.

LOAD_LIBRARY_SEARCH_USER_DIRS
0x00000400
이 값을 사용하는 경우 AddDllDirectory 또는 SetDllDirectory 함수를 사용하여 추가된 디렉터 리가 DLL 및 해당 종속성을 검색합니다. 둘 이상의 디렉터리가 추가된 경우 디렉터리를 검색하는 순서는 지정되지 않습니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH 결합할 수 없습니다.

Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다.

Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다.

LOAD_WITH_ALTERED_SEARCH_PATH
0x00000008
이 값을 사용하고 lpFileName 이 절대 경로를 지정하는 경우 시스템은 주의 섹션에 설명된 대체 파일 검색 전략을 사용하여 지정된 모듈이 로드되도록 하는 관련 실행 모듈을 찾습니다. 이 값을 사용하고 lpFileName 이 상대 경로를 지정하면 동작이 정의되지 않습니다.

이 값을 사용하지 않거나 lpFileName 이 경로를 지정하지 않으면 시스템은 주의 섹션에 설명된 표준 검색 전략을 사용하여 지정된 모듈이 로드되도록 하는 관련 실행 모듈을 찾습니다.

이 값은 LOAD_LIBRARY_SEARCH 플래그와 결합할 수 없습니다.

LOAD_LIBRARY_REQUIRE_SIGNED_TARGET
0x00000080
이진 이미지의 디지털 서명을 로드 시 검사해야 되도록 지정합니다.

이 값에는 Windows 8.1, Windows 10 이상이 필요합니다.

LOAD_LIBRARY_SAFE_CURRENT_DIRS
0x00002000
이 값을 사용하는 경우 현재 디렉터리에서 실행하기 위해 DLL을 로드하는 것은 안전 로드 목록의 디렉터리 아래에 있는 경우에만 허용됩니다.

반환 값

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

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

설명

LoadLibraryEx 함수는 LoadLibrary 함수와 매우 유사합니다. 차이점은 LoadLibraryEx 에서 제공하는 선택적 동작 집합으로 구성됩니다.

  • LoadLibraryEx 는 DLL의 DllMain 함수를 호출하지 않고 DLL 모듈을 로드할 수 있습니다.
  • LoadLibraryEx 는 모듈이 실행되지 않는 경우에 최적화된 방식으로 모듈을 로드하여 모듈을 데이터 파일인 것처럼 로드할 수 있습니다.
  • LoadLibraryEx 는 두 가지 검색 전략 중 하나를 사용하여 모듈 및 관련 모듈을 찾거나 프로세스별 디렉터리 집합을 검색할 수 있습니다.
dwFlags 매개 변수를 설정하여 이러한 선택적 동작을 선택합니다. dwFlags가 0이면 LoadLibraryExLoadLibrary와 동일하게 동작합니다.

호출 프로세스는 LoadLibraryEx 에서 반환된 핸들을 사용하여 GetProcAddress, FindResourceLoadResource 함수에 대한 호출에서 모듈을 식별할 수 있습니다.

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

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

Visual C++: Visual C++ 컴파일러는 스레드 지역 변수인 _declspec(스레드)를 선언할 수 있는 구문을 지원합니다. DLL에서 이 구문을 사용하는 경우 Windows Vista 이전 버전의 Windows에서 LoadLibraryEx 를 사용하여 DLL을 명시적으로 로드할 수 없습니다. DLL이 명시적으로 로드되는 경우 _declspec(스레드) 대신 스레드 로컬 스토리지 함수를 사용해야 합니다. 예제는 동적 링크 라이브러리에서 스레드 로컬 스토리지 사용을 참조하세요.

DLL을 데이터 파일 또는 이미지 리소스로 로드

LOAD_LIBRARY_AS_DATAFILE, LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVELOAD_LIBRARY_AS_IMAGE_RESOURCE 값은 프로세스별 참조 수 및 지정된 모듈의 로드에 영향을 미칩니다. dwFlags 매개 변수에 대해 이러한 값이 지정된 경우 로더는 모듈이 프로세스에 의해 실행 파일 DLL로 이미 로드되었는지 여부를 확인합니다. 이 경우 모듈이 호출 프로세스의 가상 주소 공간에 이미 매핑되어 있음을 의미합니다. 이 경우 LoadLibraryEx 는 DLL에 대한 핸들을 반환하고 DLL 참조 수를 증분합니다. DLL 모듈이 아직 DLL로 로드되지 않은 경우 시스템은 모듈을 실행 파일 DLL이 아닌 데이터 또는 이미지 파일로 매핑합니다. 이 경우 LoadLibraryEx 는 로드된 데이터 또는 이미지 파일에 대한 핸들을 반환하지만 모듈에 대한 참조 수를 증가시키지 않으며 CreateToolhelp32Snapshot 또는 EnumProcessModules와 같은 함수에 모듈을 표시하지 않습니다.

LOAD_LIBRARY_AS_DATAFILE,LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 또는 LOAD_LIBRARY_AS_IMAGE_RESOURCE 있는 동일한 파일에 대해 LoadLibraryEx가 두 번 호출되면 파일에 대해 두 개의 개별 매핑이 만들어집니다.

LOAD_LIBRARY_AS_IMAGE_RESOURCE 값을 사용하면 모듈이 PE(이식 가능한 실행 파일) 섹션 맞춤 확장을 사용하여 이미지로 로드됩니다. RVA(상대 가상 주소)는 디스크 주소에 매핑할 필요가 없으므로 모듈에서 리소스를 더 빠르게 검색할 수 있습니다. LOAD_LIBRARY_AS_IMAGE_RESOURCE 지정하면 다른 프로세스가 로드되는 동안 모듈을 수정할 수 없습니다.

애플리케이션이 특정 이미지 매핑 특성에 의존하지 않는 한 LOAD_LIBRARY_AS_IMAGE_RESOURCE 값은 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 또는 LOAD_LIBRARY_AS_DATAFILE 함께 사용해야 합니다. 이렇게 하면 로더가 모듈을 이미지 리소스 또는 데이터 파일로 로드할지 여부를 선택할 수 있으며, 시스템에서 페이지를 보다 효과적으로 공유할 수 있는 옵션을 선택할 수 있습니다. FindResource와 같은 리소스 함수는 두 매핑 중 하나를 사용할 수 있습니다.

모듈이 로드된 방법을 확인하려면 다음 매크로 중 하나를 사용하여 LoadLibraryEx에서 반환된 핸들을 테스트합니다.

#define LDR_IS_DATAFILE(handle)      (((ULONG_PTR)(handle)) &  (ULONG_PTR)1)
#define LDR_IS_IMAGEMAPPING(handle)  (((ULONG_PTR)(handle)) & (ULONG_PTR)2)
#define LDR_IS_RESOURCE(handle)      (LDR_IS_IMAGEMAPPING(handle) || LDR_IS_DATAFILE(handle))

다음 표에서는 이러한 매크로에 대해 설명합니다.

매크로 Description
LDR_IS_DATAFILE(handle) 이 매크로가 TRUE를 반환하면 모듈이 데이터 파일(LOAD_LIBRARY_AS_DATAFILE 또는 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)으로 로드됩니다.
LDR_IS_IMAGEMAPPING(handle) 이 매크로가 TRUE를 반환하면 모듈이 이미지 파일(LOAD_LIBRARY_AS_IMAGE_RESOURCE)으로 로드됩니다.
LDR_IS_RESOURCE(handle) 이 매크로가 TRUE를 반환하면 모듈이 데이터 파일 또는 이미지 파일로 로드됩니다.
 

FreeLibrary 함수를 사용하여 모듈을 로드하면 참조 수가 증가했는지 여부에 관계없이 로드된 모듈을 해제할 수 있습니다. 모듈이 데이터 또는 이미지 파일로 로드된 경우 매핑이 제거되지만 참조 수는 감소되지 않습니다. 그렇지 않으면 DLL 참조 수가 감소합니다. 따라서 LoadLibraryEx 에서 반환된 핸들을 사용하여 FreeLibrary를 호출하는 것이 안전합니다.

DLL 및 종속성 검색

검색 경로는 DLL을 검색하는 디렉터리 집합입니다. LoadLibraryEx 함수는 표준 검색 경로 또는 변경된 검색 경로를 사용하여 DLL을 검색하거나 SetDefaultDllDirectoriesAddDllDirectory 함수로 설정된 프로세스별 검색 경로를 사용할 수 있습니다. 디렉터리 목록 및 검색 순서는 Dynamic-Link 라이브러리 검색 순서를 참조하세요.

LoadLibraryEx 함수는 다음 경우에 표준 검색 경로를 사용합니다.

  • 파일 이름은 경로 없이 지정되며 기본 파일 이름이 로드된 모듈의 기본 파일 이름과 일치하지 않으며 LOAD_LIBRARY_SEARCH 플래그는 사용되지 않습니다.
  • 경로가 지정되었지만 LOAD_WITH_ALTERED_SEARCH_PATH 사용되지 않습니다.
  • 애플리케이션이 SetDefaultDllDirectories를 사용하여 프로세스에 대한 기본 DLL 검색 경로를 지정하지 않았습니다.

lpFileName이 상대 경로를 지정하면 전체 상대 경로가 DLL 검색 경로의 모든 토큰에 추가됩니다. 다른 경로를 검색하지 않고 상대 경로에서 모듈을 로드하려면 GetFullPathName 을 사용하여 비관계형 경로를 가져와서 비관계형 경로로 LoadLibraryEx 를 호출합니다. 모듈이 데이터 파일로 로드되고 상대 경로가 "." 또는 ".."로 시작하는 경우 상대 경로는 절대 경로로 처리됩니다.

lpFileName이 절대 경로를 지정하고 dwFlagsLOAD_WITH_ALTERED_SEARCH_PATH 설정된 경우 LoadLibraryEx는 변경된 검색 경로를 사용합니다. LOAD_WITH_ALTERED_SEARCH_PATH 플래그가 설정되면 동작이 정의되지 않으며 lpFileName은 상대 경로를 지정합니다.

SetDllDirectory 함수를 사용하여 검색 경로를 수정할 수 있습니다. 이 솔루션은 SetCurrentDirectory 를 사용하거나 DLL에 대한 전체 경로를 하드 코딩하는 것보다 좋습니다. 그러나 SetDllDirectory 를 사용하면 지정된 디렉터리가 검색 경로에 있고 스레드로부터 안전하지 않은 동안 안전한 DLL 검색 모드를 효과적으로 사용하지 않도록 설정할 수 있습니다. 가능한 경우 AddDllDirectory 를 사용하여 기본 프로세스 검색 경로를 수정하는 것이 가장 좋습니다. 자세한 내용은 Dynamic-Link 라이브러리 검색 순서를 참조하세요.

애플리케이션은 LOAD_LIBRARY_SEARCH_* 플래그를 사용하여 단일 LoadLibraryEx 호출을 검색할 디렉터리를 지정할 수 있습니다. 둘 이상의 LOAD_LIBRARY_SEARCH 플래그를 지정하면 디렉터리를 다음 순서로 검색합니다.

  • DLL(LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)이 포함된 디렉터리입니다. 이 디렉터리가 로드할 DLL의 종속성에 대해서만 검색됩니다.
  • 애플리케이션 디렉터리(LOAD_LIBRARY_SEARCH_APPLICATION_DIR)입니다.
  • AddDllDirectory 함수(LOAD_LIBRARY_SEARCH_USER_DIRS) 또는 SetDllDirectory 함수를 사용하여 애플리케이션 검색 경로에 명시적으로 추가된 경로입니다. 둘 이상의 경로가 추가된 경우 경로를 검색하는 순서가 지정되지 않습니다.
  • System32 디렉터리(LOAD_LIBRARY_SEARCH_SYSTEM32)입니다.

Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: LOAD_LIBRARY_SEARCH_ 플래그는 KB2533623 설치된 시스템에서 사용할 수 있습니다. 플래그를 사용할 수 있는지 여부를 확인하려면 GetProcAddress 를 사용하여 AddDllDirectory, RemoveDllDirectory 또는 SetDefaultDllDirectories 함수의 주소를 가져옵니다. GetProcAddress성공하면 LOAD_LIBRARY_SEARCH_ 플래그를 LoadLibraryEx와 함께 사용할 수 있습니다.

애플리케이션이 SetDefaultDllDirectories 함수를 사용하여 프로세스에 대한 DLL 검색 경로를 설정하고 LOAD_LIBRARY_SEARCH_* 플래그를 사용하지 않는 경우 LoadLibraryEx 함수는 표준 검색 경로 대신 프로세스 DLL 검색 경로를 사용합니다.

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

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

보안 설명

LOAD_LIBRARY_AS_DATAFILE 로드하는 동안 다른 프로세스가 모듈을 수정하는 것을 방지하지 않습니다. 이렇게 하면 애플리케이션의 보안이 떨어지므로 LOAD_LIBRARY_AS_DATAFILE 사용해야 하는 경우가 아니면 모듈을 데이터 파일로 로드할 때 LOAD_LIBRARY_AS_DATAFILE 대신 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 사용해야 합니다. LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 지정하면 다른 프로세스에서 모듈이 로드되는 동안 모듈을 수정할 수 없습니다. 동일한 호출에서 LOAD_LIBRARY_AS_DATAFILELOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 지정하지 마세요.

SearchPath 함수를 사용하여 후속 LoadLibraryEx 호출에 대한 DLL 경로를 검색하지 마세요. SearchPath 함수는 LoadLibraryEx와 다른 검색 순서를 사용하며 BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE SetSearchPathMode를 호출하여 명시적으로 사용하도록 설정되지 않는 한 안전한 프로세스 검색 모드를 사용하지 않습니다. 따라서 SearchPath 는 먼저 지정된 DLL에 대한 사용자의 현재 작업 디렉터리를 검색할 가능성이 높습니다. 공격자가 DLL의 악성 버전을 현재 작업 디렉터리에 복사한 경우 SearchPath 에서 검색한 경로는 LoadLibraryEx 가 로드하는 악의적인 DLL을 가리킵니다.

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

DLL 보안 문제에 대한 일반적인 내용은 Dynamic-Link 라이브러리 보안을 참조하세요.

예제

다음 코드 예제에서는 LoadLibraryExA 호출을 보여 줍니다.

//Load the FMAPI DLL
hLib = ::LoadLibraryEx(L"fmapi.dll", NULL, NULL);
if ( !hLib )
{
      wprintf(L"Could not load fmapi.dll, Error #%d.\n", GetLastError());
      return;
}

추가 예제는 오류 코드 번호에 대한 텍스트 조회를 참조하세요.

참고

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

요구 사항

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

참고 항목

DllMain

동적 연결 라이브러리 함수

동적 연결 라이브러리 검색 순서

Dynamic-Link 라이브러리 보안

FindResource

FreeLibrary

GetProcAddress

GetSystemDirectory

GetWindowsDirectory

LoadLibrary

LoadResource

OpenFile

런타임 동적 연결

SearchPath

SetDllDirectory

SetErrorMode