FreeLibrary 函数 (libloaderapi.h)
释放加载的动态链接库 (DLL) 模块,并在必要时递减其引用计数。 当引用计数达到零时,模块将从调用进程的地址空间中卸载,句柄不再有效。
语法
BOOL FreeLibrary(
[in] HMODULE hLibModule
);
parameters
[in] hLibModule
已加载的库模块的句柄。 LoadLibrary、LoadLibraryEx、
GetModuleHandle 或 GetModuleHandleEx 函数返回此句柄。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 若要获得更多的错误信息,请调用 GetLastError 函数。
注解
系统为每个加载的模块维护每个进程引用计数。 由于加载时动态链接,在进程初始化时加载的模块的引用计数为 1。 每次调用 LoadLibrary 加载模块时,模块的引用计数都会递增。 引用计数也会通过对 LoadLibraryEx 的调用递增,除非模块是首次加载并且作为数据或图像文件加载的。
每次为模块调用 FreeLibrary 或 FreeLibraryAndExitThread 函数时,引用计数都会递减。 当模块的引用计数达到零或进程终止时,系统会从进程的地址空间中卸载模块。 在卸载库模块之前,系统允许模块通过调用模块的 DllMain 函数(如果有),并使用 DLL_PROCESS_DETACH 值从进程分离。 这样做使库模块有机会清理代表当前进程分配的资源。 在入口点函数返回之后,将从当前进程的地址空间移除库模板。
从 DllMain 调用 FreeLibrary 是不安全的。 有关详细信息,请参阅 DllMain 中的“备注”部分。
调用 FreeLibrary 不会影响使用同一模块的其他进程。
使用 GetModuleHandle 返回的句柄调用 FreeLibrary 时要小心。 GetModuleHandle 函数不会递增模块的引用计数,因此将此句柄传递给 FreeLibrary 可能会导致模块过早卸载。
必须卸载它正在执行的 DLL 然后终止自己的线程应调用 FreeLibraryAndExitThread ,而不是单独调用 FreeLibrary 和 ExitThread 。 否则,可能会出现争用条件。 有关详细信息,请参阅 FreeLibraryAndExitThread 的“备注”部分。
示例
有关示例,请参阅 使用 Run-Time 动态链接。
要求
最低受支持的客户端 | Windows XP [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | libloaderapi.h (包括 Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |