CoFreeUnusedLibrariesEx 함수(combaseapi.h)
더 이상 사용되지 않고 언로드 지연이 만료된 DLL을 언로드합니다.
구문
void CoFreeUnusedLibrariesEx(
[in] DWORD dwUnloadDelay,
[in] DWORD dwReserved
);
매개 변수
[in] dwUnloadDelay
DLL이 언급한 시간 사이의 지연 시간(밀리초)은 언로드할 후보가 될 때까지 언로드할 수 있습니다. 이 매개 변수를 INFINITE로 설정하면 시스템 기본 지연(10분)이 사용됩니다. 이 매개 변수를 0으로 설정하면 지연 없이 DLL이 강제로 언로드됩니다.
[in] dwReserved
이 매개 변수는 예약되어 있으며 0이어야 합니다.
반환 값
없음
설명
COM은 구성 요소가 포함된 DLL이 보유한 메모리를 회수하는 함수를 제공합니다. 가장 일반적으로 사용되는 함수는 CoFreeUnusedLibraries입니다. CoFreeUnusedLibraries 는 활성 개체가 없는 DLL을 즉시 해제하지 않습니다. 다중 스레드 아파트(MOTA) 및 중립 아파트(NA)의 경우 10분 지연이 있습니다. STA(단일 스레드 아파트)의 경우 지연이 없습니다.
CoFreeUnusedLibraries의 10분 지연은 구성 요소 DLL 언로드로 인한 다중 스레드 경합 조건을 방지하는 것입니다. 이 기본 지연은 많은 애플리케이션에서 너무 길 수 있습니다.
COM은 이 함수가 호출되는 스레드에서 호스트할 수 있는 아파트에 대해 구성 요소가 로드된 활성 DLL 목록을 유지 관리합니다. CoFreeUnusedLibrariesEx가 호출되면 해당 목록의 각 DLL에는 DllCanUnloadNow 함수가 호출됩니다. DllCanUnloadNow가 S_FALSE 반환하거나 내보내지 않으면 이 DLL을 언로드할 준비가 되지 않습니다. DllCanUnloadNow가 S_OK 반환하는 경우 이 DLL은 활성 목록에서 "언로드할 후보" 목록으로 이동합니다.
DLL을 언로드 후보 목록에 추가하면 이 이동이 발생할 때부터 DLL dwUnloadDelay 밀리초가 표시됩니다. CoFreeUnusedLibrariesEx(또는 CoFreeUnusedLibraries)가 다시 호출되면 DLL을 언로드할 후보 목록으로 이동한 호출에서 적어도 dwUnloadDelay 밀리초가면 DLL이 실제로 메모리에서 해제됩니다. DLL이 언로드 후보 목록에 있는 동안 COM에서 구성 요소 DLL을 사용하는 경우 활성 목록으로 다시 이동됩니다.
dwUnloadDelay를 0으로 설정하면 예기치 않은 결과가 발생할 수 있습니다. 구성 요소 DLL은 DllCanUnloadNow 함수에서 반환된 후 정리하는 데 약간의 시간이 필요할 수 있습니다. 예를 들어 DLL에 자체 작업자 스레드가 있는 경우 0 값을 사용하면 이러한 스레드에서 실행되는 코드가 매핑되지 않으므로 작업자 스레드가 종료되기 전에 DLL의 언로드로 인해 문제가 발생할 가능성이 큽니다. 또한 dwUnloadDelay 값이 너무 짧으면 DLL을 다시 로드하는 데 페이지 아웃하는 것보다 오버헤드가 더 많기 때문에 성능 문제가 발생할 수 있습니다.
이 동작은 스레드 모델이 Free, Neutral 또는 Both로 설정된 구성 요소를 제공하는 DLL에 의해 트리거됩니다. Apartment로 설정된 스레딩 모델의 경우(또는 스레딩 모델이 지정되지 않은 경우) dwUnloadDelay 는 이러한 구성 요소가 아파트를 호스트하는 단일 스레드에 연결되기 때문에 0으로 처리됩니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | combaseapi.h(Objbase.h 포함) |
라이브러리 | Ole32.lib |
DLL | ComBase.dll |