不止一次加载DLL?

时间:2012-02-08 09:43:49

标签: c++ windows linux dll shared-libraries

我正在使用LoadLibrary函数在Windows中加载DLL。我的问题是:如果我为同一个DLL多次调用此方法,我是否获取DLL的不同实例的句柄,还是它们都引用同一个实例?

此外,这种行为与Linux SO文件有何关联,它是相同还是完全不同,我可以在这方面做出哪些假设?感谢。

3 个答案:

答案 0 :(得分:12)

MSDN文档声明:

  

系统维护所有已加载的每进程引用计数   模块。调用LoadLibrary会增加引用计数。调用   FreeLibrary或FreeLibraryAndExitThread函数递减   引用计数。系统在引用计数时卸载模块   达到零或过程终止时(无论如何)   参考计数)。

因此,似乎多次加载模块(没有匹配对FreeLibrary的调用)将返回相同的句柄。

答案 1 :(得分:3)

如果已加载DLL,LoadLibrary将只返回内存中库的地址。但是,在尝试第二次加载时,DllMain不会再次调用DLL_PROCESS_ATTACH。库中的句柄只是内存位置,因此第二次获得的值应该与第一次相同。

就linux SO文件而言,我不明白他们为什么会加载两次。然而,其他人将不得不权衡这一点,以给你一个正确的答案。

答案 2 :(得分:3)

对于Linux共享对象,来自dlopen(3) manpage

  

如果使用dlopen()再次加载相同的库,则同一文件   句柄返回dl库维护引用计数   库句柄,所以动态库在释放之前不会被释放   dlclose()已多次调用dlopen()   成功了吗 _init()例程(如果存在)仅被调用一次。   但随后使用RTLD_NOW调用可能会强制符号解析   早期加载RTLD_LAZY的库。