Функция CoFreeUnusedLibrariesEx (combaseapi.h)

Выгружает все библиотеки DLL, которые больше не используются и срок действия задержки выгрузки которых истек.

Синтаксис

void CoFreeUnusedLibrariesEx(
  [in] DWORD dwUnloadDelay,
  [in] DWORD dwReserved
);

Параметры

[in] dwUnloadDelay

Задержка в миллисекундах между моментом, когда библиотека DLL заявила, что она может быть выгружена до тех пор, пока она не станет кандидатом для выгрузки. При установке этого параметра значения INFINITE используется системная задержка по умолчанию (10 минут). Если задать для этого параметра значение 0, все библиотеки DLL будут выгружены без каких-либо задержек.

[in] dwReserved

Этот параметр зарезервирован и должен иметь значение 0.

Возвращаемое значение

None

Remarks

COM предоставляет функции для освобождения памяти, удерживаемой библиотеками DLL, содержащими компоненты. Чаще всего используется функция CoFreeUnusedLibraries. CoFreeUnusedLibraries не освобождает библиотеки DLL без активного объекта. Существует 10-минутная задержка для многопоточных квартир (MTAs) и нейтральных квартир (NAs). Для однопоточных квартир (STA) задержка отсутствует.

10-минутная задержка для CoFreeUnusedLibraries заключается в том, чтобы избежать многопоточных условий гонки, вызванных выгрузкой библиотеки DLL компонента. Эта задержка по умолчанию может быть слишком длинной для многих приложений.

COM поддерживает список активных библиотек DLL, в которых были загружены компоненты для квартир, которые можно разместить в потоке, в котором вызывается эта функция. При вызове CoFreeUnusedLibrariesEx каждая библиотека DLL в этом списке имеет свою функцию DllCanUnloadNow . Если dllCanUnloadNow возвращает S_FALSE (или не экспортируется), эта библиотека DLL не готова к выгрузке. Если DllCanUnloadNow возвращает S_OK, эта библиотека DLL перемещается из активного списка в список "кандидат для выгрузки".

Добавление библиотеки DLL в список кандидатов для выгрузки определяет метки времени dll dwUnloadDelay в миллисекундах при этом перемещении. При повторном вызове CoFreeUnusedLibrariesEx (или CoFreeUnusedLibraries) по крайней мере dwUnloadDelay в миллисекундах из вызова, который переместил библиотеку DLL в список кандидатов для выгрузки, библиотека DLL фактически освобождается из памяти. Если COM использует библиотеку DLL компонента, когда библиотека DLL находится в списке кандидатов для выгрузки, она перемещается обратно в активный список.

Установка dwUnloadDelay значения 0 может привести к непредвиденным последствиям. Библиотеке DLL компонента может потребоваться некоторое время для очистки после возврата из функции DllCanUnloadNow . Например, если библиотека DLL имеет собственные рабочие потоки, использование значения 0, скорее всего, приведет к проблеме, так как код, выполняемый в этих потоках, будет несопоставлен, что вызвано выгрузкой библиотеки DLL до выхода рабочих потоков. Кроме того, использование слишком короткого значения для dwUnloadDelay может привести к проблемам с производительностью, так как перезагрузка БИБЛИОТЕКи DLL превышает ее выход из страницы.

Это поведение активируется библиотекой DLL, предоставляющей компоненты с моделями потоков, равными Free, Neutral или Both. Для потоковой модели, для которых задано значение Apartment (или если не указана потоковая модель), dwUnloadDelay обрабатывается как 0, так как эти компоненты привязаны к одному потоку, в котором размещается квартира.

Требования

Требование Значение
Минимальная версия клиента Windows XP [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header combaseapi.h (включая Objbase.h)
Библиотека Ole32.lib
DLL ComBase.dll

См. также раздел

CoFreeAllLibraries

CoFreeLibrary

CoFreeUnusedLibraries

CoLoadLibrary

DllCanUnloadNow