Función CoFreeUnusedLibrariesEx (combaseapi.h)
Descarga los archivos DLL que ya no están en uso y cuyo retraso de descarga ha expirado.
Sintaxis
void CoFreeUnusedLibrariesEx(
[in] DWORD dwUnloadDelay,
[in] DWORD dwReserved
);
Parámetros
[in] dwUnloadDelay
Retraso en milisegundos entre el momento en que el archivo DLL ha indicado que se puede descargar hasta que se convierta en candidato para descargar. Al establecer este parámetro en INFINITE, se usa el retraso predeterminado del sistema (10 minutos). Al establecer este parámetro en 0, se fuerza la descarga de los archivos DLL sin ningún retraso.
[in] dwReserved
Este parámetro está reservado y debe ser 0.
Valor devuelto
None
Observaciones
COM proporciona funciones para reclamar la memoria mantenida por archivos DLL que contienen componentes. La función más usada es CoFreeUnusedLibraries. CoFreeUnusedLibraries no libera inmediatamente los archivos DLL que no tienen ningún objeto activo. Hay un retraso de 10 minutos para apartamentos multiproceso (MTAs) y apartamentos neutros (NAs). En el caso de los apartamentos de un solo subproceso (STA), no hay ningún retraso.
El retraso de 10 minutos para CoFreeUnusedLibraries es evitar condiciones de carrera multiproceso causadas por la descarga de un archivo DLL de componente. Este retraso predeterminado puede ser demasiado largo para muchas aplicaciones.
COM mantiene una lista de archivos DLL activos que tienen componentes cargados para los apartamentos que se pueden hospedar en el subproceso donde se llama a esta función. Cuando se llama a CoFreeUnusedLibrariesEx , cada DLL de esa lista tiene llamada a su función DllCanUnloadNow . Si DllCanUnloadNow devuelve S_FALSE (o no se exporta), este archivo DLL no está listo para descargarse. Si DllCanUnloadNow devuelve S_OK, este archivo DLL se mueve de la lista activa a una lista "candidata para descarga".
Al agregar el archivo DLL a las marcas de tiempo de lista candidata para descarga, el archivo DLL dwUnloadDelay milisegundos desde el momento en que se produce este movimiento. Cuando se llama de nuevo a CoFreeUnusedLibrariesEx (o CoFreeUnusedLibraries), al menos dwUnloadDelay milisegundos de la llamada que movió el archivo DLL a la lista de descarga candidata para descarga, el archivo DLL se libera realmente de la memoria. Si COM usa el archivo DLL de componente mientras el archivo DLL está en la lista candidata para descarga, se vuelve a mover a la lista activa.
Establecer dwUnloadDelay en 0 puede tener consecuencias inesperadas. Es posible que el archivo DLL del componente necesite algún tiempo para la limpieza después de que vuelva de la función DllCanUnloadNow . Por ejemplo, si el archivo DLL tuviera sus propios subprocesos de trabajo, el uso de un valor de 0 probablemente provocaría un problema porque el código que se ejecuta en estos subprocesos no se asignaría, causado por la descarga del archivo DLL antes de que los subprocesos de trabajo tengan la oportunidad de salir. Además, el uso de demasiado breve de un valor para dwUnloadDelay puede provocar problemas de rendimiento porque hay más sobrecarga en la recarga de un archivo DLL que dejar que se agote la página.
Este comportamiento lo desencadena el archivo DLL que proporciona componentes con modelos de subprocesos establecidos en Gratis, Neutro o Ambos. Para un modelo de subprocesos establecido en Apartment (o si no se especifica ningún modelo de subproceso), dwUnloadDelay se trata como 0 porque estos componentes están vinculados al único subproceso que hospeda el apartamento.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows XP [aplicaciones de escritorio | aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | combaseapi.h (incluya Objbase.h) |
Library | Ole32.lib |
Archivo DLL | ComBase.dll |