동적 연결 Run-Time

애플리케이션이 LoadLibrary 또는 LoadLibraryEx 함수를 호출하면 시스템에서 DLL을 찾으려고 시도합니다(자세한 내용은 Dynamic-Link 라이브러리 검색 순서 참조). 검색이 성공하면 시스템은 DLL 모듈을 프로세스의 가상 주소 공간에 매핑하고 참조 수를 증분합니다. LoadLibrary 또는 LoadLibraryEx 호출에서 코드가 호출 프로세스의 가상 주소 공간에 이미 매핑된 DLL을 지정하는 경우 함수는 단순히 DLL에 대한 핸들을 반환하고 DLL 참조 수를 증가합니다. 기본 파일 이름과 확장명이 동일하지만 다른 디렉터리에 있는 두 개의 DLL은 동일한 DLL로 간주되지 않습니다.

시스템은 LoadLibrary 또는 LoadLibraryEx 라는 스레드의 컨텍스트에서 진입점 함수를 호출 합니다. FreeLibrary 함수에 대한 해당 호출 없이 LoadLibrary 또는 LoadLibraryEx 호출을 통해 프로세스에서 DLL을 이미 로드한 경우 진입점 함수가 호출되지 않습니다.

시스템에서 DLL을 찾을 수 없거나 진입점 함수가 FALSE를 반환하는 경우 LoadLibrary 또는 LoadLibraryEx 는 NULL을 반환합니다. LoadLibrary 또는 LoadLibraryEx가 성공하면 DLL 모듈에 대한 핸들을 반환합니다. 프로세스는 이 핸들을 사용하여 GetProcAddress, FreeLibrary 또는 FreeLibraryAndExitThread 함수 호출에서 DLL 식별할 수 있습니다.

GetModuleHandle 함수는 GetProcAddress, FreeLibrary 또는 FreeLibraryAndExitThread에 사용되는 핸들 반환합니다. GetModuleHandle 함수는 로드 시간 연결 또는 LoadLibrary 또는 LoadLibraryEx에 대한 이전 호출을 통해 DLL 모듈이 프로세스의 주소 공간에 이미 매핑된 경우에만 성공합니다. LoadLibrary 또는 LoadLibraryEx와 달리 GetModuleHandle은 모듈 참조 수를 증가시키지 않습니다. GetModuleFileName 함수는 GetModuleHandle, LoadLibrary 또는 LoadLibraryEx에서 반환된 핸들과 연결된 모듈의 전체 경로를 검색합니다.

이 프로세스는 GetProcAddress를 사용하여 LoadLibrary 또는 LoadLibraryEx, GetModuleHandle에서 반환된 DLL 모듈 핸들을 사용하여 DLL에서 내보낸 함수의 주소를 가져올 수 있습니다.

DLL 모듈이 더 이상 필요하지 않은 경우 프로세스는 FreeLibrary 또는 FreeLibraryAndExitThread를 호출할 수 있습니다. 이러한 함수는 참조 수가 0인 경우 모듈 참조 수를 감소시키고 프로세스의 가상 주소 공간에서 DLL 코드의 매핑을 해제합니다.

런타임 동적 연결을 사용하면 DLL을 사용할 수 없는 경우에도 프로세스를 계속 실행할 수 있습니다. 그런 다음 프로세스는 대체 메서드를 사용하여 목표를 달성할 수 있습니다. 예를 들어 프로세스에서 하나의 DLL을 찾을 수 없는 경우 다른 DLL을 사용하거나 사용자에게 오류를 알릴 수 있습니다. 사용자가 누락된 DLL의 전체 경로를 제공할 수 있는 경우 프로세스는 이 정보를 사용하여 일반 검색 경로에 없는 경우에도 DLL을 로드할 수 있습니다. 이 상황은 시스템이 DLL을 찾을 수 없는 경우 프로세스를 종료하는 로드 시간 연결과 대조됩니다.

런타임 동적 연결은 DLL이 DllMain 함수를 사용하여 프로세스의 각 스레드에 대해 초기화를 수행하는 경우 문제가 발생할 수 있습니다. LoadLibrary 또는 LoadLibraryEx 가 호출되기 전에 존재했던 스레드에 대해 진입점이 호출되지 않기 때문입니다. 이 문제를 처리하는 방법을 보여 주는 예제는 Dynamic-Link 라이브러리에서 스레드 로컬 스토리지 사용을 참조하세요.

런타임 동적 연결 사용