我正在使用LoadLibrary
函数在Windows中加载DLL。我的问题是:如果我为同一个DLL多次调用此方法,我是否获取DLL的不同实例的句柄,还是它们都引用同一个实例?
此外,这种行为与Linux SO文件有何关联,它是相同还是完全不同,我可以在这方面做出哪些假设?感谢。
答案 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
的库。