다음을 통해 공유


Dynamic-Link 라이브러리 정보

동적 연결을 사용하면 모듈이 로드 시간 또는 런타임에 내보낸 DLL 함수를 찾는 데 필요한 정보만 포함할 수 있습니다. 동적 연결은 링커가 라이브러리 함수의 코드를 호출하는 각 모듈에 복사하는 친숙한 정적 연결과 다릅니다.

동적 연결 유형

DLL에서 함수를 호출하는 방법에는 두 가지가 있습니다.

  • 로드 시간 동적 연결에서 모듈은 내보낸 DLL 함수를 로컬 함수인 것처럼 명시적으로 호출합니다. 이렇게 하려면 함수를 포함하는 DLL에 대한 가져오기 라이브러리와 모듈을 연결해야 합니다. 가져오기 라이브러리는 애플리케이션이 로드될 때 DLL을 로드하고 내보낸 DLL 함수를 찾는 데 필요한 정보를 시스템에 제공합니다.
  • 런타임 동적 연결에서 모듈은 LoadLibrary 또는 LoadLibraryEx 함수를 사용하여 런타임에 DLL을 로드합니다. DLL이 로드된 후 모듈은 GetProcAddress 함수를 호출하여 내보낸 DLL 함수의 주소를 가져옵니다. 이 모듈은 GetProcAddress에서 반환된 함수 포인터를 사용하여 내보낸 DLL 함수를 호출합니다. 이렇게 하면 가져오기 라이브러리가 필요하지 않습니다.

DLL 및 메모리 관리

DLL을 로드하는 모든 프로세스는 해당 가상 주소 공간에 매핑합니다. 프로세스가 DLL을 가상 주소로 로드한 후 내보낸 DLL 함수를 호출할 수 있습니다.

시스템은 각 DLL에 대한 프로세스별 참조 수를 유지 관리합니다. 스레드가 DLL을 로드하면 참조 수가 하나씩 증가합니다. 프로세스가 종료되거나 참조 수가 0이 되면(런타임 동적 연결만 해당) DLL이 프로세스의 가상 주소 공간에서 언로드됩니다.

다른 함수와 마찬가지로 내보낸 DLL 함수는 이를 호출하는 스레드의 컨텍스트에서 실행됩니다. 따라서 다음 조건이 적용됩니다.

  • DLL을 호출한 프로세스의 스레드는 DLL 함수에서 연 핸들을 사용할 수 있습니다. 마찬가지로 호출 프로세스의 스레드에서 연 핸들은 DLL 함수에서 사용할 수 있습니다.
  • DLL은 호출 스레드의 스택과 호출 프로세스의 가상 주소 공간을 사용합니다.
  • DLL은 호출 프로세스의 가상 주소 공간에서 메모리를 할당합니다.

DLL에 대한 자세한 내용은 다음 topics 참조하세요.