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

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

Синтаксис

BOOL FreeLibrary(
  [in] HMODULE hLibModule
);

Параметры

[in] hLibModule

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

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

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

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

Комментарии

Система поддерживает количество ссылок на каждый процесс для каждого загруженного модуля. Модуль, загруженный во время инициализации процесса из-за динамической компоновки во время загрузки, имеет количество ссылок в одном. Число ссылок для модуля увеличивается каждый раз, когда модуль загружается вызовом 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

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