Поделиться через


Функция FreeLibrary (libloaderapi.h)

Освобождает загруженный модуль библиотеки динамической компоновки (DLL) и при необходимости уменьшает его число ссылок. Когда число ссылок достигает нуля, модуль выгружается из адресного пространства вызывающего процесса, и дескриптор становится недействительным.

Синтаксис

BOOL FreeLibrary(
  [in] HMODULE hLibModule
);

Параметры

[in] hLibModule

Дескриптор загруженного модуля библиотеки. LoadLibrary, LoadLibraryEx,
Функция GetModuleHandle или GetModuleHandleEx возвращает этот дескриптор.

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

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция выполняется неудачно, возвращается нулевое значение. Чтобы получить расширенные сведения об ошибке, вызовите функцию GetLastError .

Комментарии

Система поддерживает количество ссылок по каждому процессу для каждого загруженного модуля. Модуль, загруженный во время инициализации процесса из-за динамического связывания во время загрузки, имеет число ссылок, 1. Число ссылок для модуля увеличивается каждый раз, когда модуль загружается вызовом LoadLibrary. Количество ссылок также увеличивается вызовом LoadLibraryEx , если модуль не загружается в первый раз и не загружается в виде файла данных или изображения.

Количество ссылок уменьшается при каждом вызове функции FreeLibrary или FreeLibraryAndExitThread для модуля. Когда число ссылок модуля достигает нуля или процесс завершается, система выгружает модуль из адресного пространства процесса. Перед выгрузкой модуля библиотеки система позволяет модулю отсоединиться от процесса путем вызова функции DllMain модуля, если она имеется, со значением DLL_PROCESS_DETACH. Это дает модулю библиотеки возможность очистить ресурсы, выделенные от имени текущего процесса. После возврата функции точки входа модуль библиотеки удаляется из адресного пространства текущего процесса.

Вызывать FreeLibrary из DllMain небезопасно. Дополнительные сведения см. в разделе Примечания статьи DllMain.

Вызов FreeLibrary не влияет на другие процессы, использующие тот же модуль.

Будьте внимательны при вызове FreeLibrary с дескриптором, возвращенным Командлетом GetModuleHandle. Функция GetModuleHandle не увеличивает число ссылок на модуль, поэтому передача этого дескриптора в FreeLibrary может привести к преждевременной выгрузке модуля.

Поток, который должен выгрузить библиотеку DLL, в которой он выполняется, а затем завершить работу, должен вызывать FreeLibraryAndExitThread вместо вызова FreeLibrary и ExitThread отдельно. В противном случае может возникнуть состояние гонки. Дополнительные сведения см. в разделе Примечания статьи FreeLibraryAndExitThread.

Примеры

Пример см. в разделе Использование динамической компоновки Run-Time.

Требования

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

См. также

DllMain

Функции библиотеки динамической компоновки

FreeLibraryAndExitThread

GetModuleHandle

GetModuleHandleEx

LoadLibrary

Динамическое связывание во время выполнения