【发布时间】:2021-02-24 14:34:08
【问题描述】:
我在文档中没有找到这个:如果我在程序结束之前需要一个 DLL 处理程序,我应该在调用程序结束之前调用FreeLibrary,还是不需要它?
【问题讨论】:
-
欺骗是另一回事 - 它是关于在 DLL 中处理资源清理。
标签: c++ c++11 dll loadlibrary
我在文档中没有找到这个:如果我在程序结束之前需要一个 DLL 处理程序,我应该在调用程序结束之前调用FreeLibrary,还是不需要它?
【问题讨论】:
标签: c++ c++11 dll loadlibrary
最佳做法是始终调用FreeLibrary 以获取任何对应的LoadLibrary 调用。但是,跳过该调用并结束您的程序可能不会导致任何严重问题,因为终止调用进程似乎与减少 DLL 的“引用计数”具有相同的效果(就像调用 FreeLibrary 一样)。
来自Microsoft documentation(我的粗体字):
每次
FreeLibrary或 为模块调用FreeLibraryAndExitThread函数。当一个 模块的引用计数达到零或进程终止, 系统从进程的地址空间卸载模块。 在卸载库模块之前,系统使模块能够 通过调用模块的 DllMain 函数从进程中分离,如果 它有一个,带有 DLL_PROCESS_DETACH 值。这样做会给 图书馆模块有机会清理分配的资源 代表当前进程。入口函数返回后, 库模块从当前地址空间中移除 过程。
最好显式调用FreeLibrary()的一个原因是,如果/当该调用返回失败(即零)状态时,您可以处理这种情况。您的 DLL 无法正确卸载的具体方式或原因的详细信息超出了此答案的范围,但您可能会发现此讨论很有帮助:What to do when FreeLibrary API call fails?
另一个原因是您代码的任何未来开发人员可能没有意识到您正在使用程序终止来隐式卸载 DLL,并且在某些情况下,这可能会导致进一步的问题。
【讨论】: