FreeLibrary 函数 (libloaderapi.h)

释放加载的动态链接库 (DLL) 模块,并在必要时递减其引用计数。 当引用计数达到零时,模块将从调用进程的地址空间中卸载,句柄不再有效。

语法

BOOL FreeLibrary(
  [in] HMODULE hLibModule
);

parameters

[in] hLibModule

已加载的库模块的句柄。 LoadLibraryLoadLibraryEx
GetModuleHandleGetModuleHandleEx 函数返回此句柄。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 若要获得更多的错误信息,请调用 GetLastError 函数。

注解

系统为每个加载的模块维护每个进程引用计数。 由于加载时动态链接,在进程初始化时加载的模块的引用计数为 1。 每次调用 LoadLibrary 加载模块时,模块的引用计数都会递增。 引用计数也会通过对 LoadLibraryEx 的调用递增,除非模块是首次加载并且作为数据或图像文件加载的。

每次为模块调用 FreeLibraryFreeLibraryAndExitThread 函数时,引用计数都会递减。 当模块的引用计数达到零或进程终止时,系统会从进程的地址空间中卸载模块。 在卸载库模块之前,系统允许模块通过调用模块的 DllMain 函数(如果有),并使用 DLL_PROCESS_DETACH 值从进程分离。 这样做使库模块有机会清理代表当前进程分配的资源。 在入口点函数返回之后,将从当前进程的地址空间移除库模板。

DllMain 调用 FreeLibrary 是不安全的。 有关详细信息,请参阅 DllMain 中的“备注”部分。

调用 FreeLibrary 不会影响使用同一模块的其他进程。

使用 GetModuleHandle 返回的句柄调用 FreeLibrary 时要小心。 GetModuleHandle 函数不会递增模块的引用计数,因此将此句柄传递给 FreeLibrary 可能会导致模块过早卸载。

必须卸载它正在执行的 DLL 然后终止自己的线程应调用 FreeLibraryAndExitThread ,而不是单独调用 FreeLibraryExitThread 。 否则,可能会出现争用条件。 有关详细信息,请参阅 FreeLibraryAndExitThread 的“备注”部分。

示例

有关示例,请参阅 使用 Run-Time 动态链接

要求

   
最低受支持的客户端 Windows XP [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 libloaderapi.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

DllMain

动态链接库函数

FreeLibraryAndExitThread

GetModuleHandle

GetModuleHandleEx

LoadLibrary

运行时动态链接