加载一个DLL不止一次?

我正在使用LoadLibrary函数在Windows中加载DLL。 我的问题是这样的:如果我为同一个DLL不止一次地调用这个方法,我得到了不同的DLL实例的句柄,还是都会引用同一个实例?

另外,这种行为与Linux SO文件是如何相关的,是相同的还是完全不同的,在这方面我能做些什么假设? 谢谢。

Solutions Collecting From Web of "加载一个DLL不止一次?"

MSDN文档指出:

系统在所有加载的模块上维护每个进程的引用计数。 调用LoadLibrary会增加引用计数。 调用FreeLibrary或FreeLibraryAndExitThread函数会减少引用计数。 系统在其引用计数达到零时或过程终止时(不管引用计数如何),卸载模块。

所以看起来,加载模块不止一次(没有匹配调用FreeLibrary)将返回相同的句柄。

如果DLL已经加载, LoadLibrary将简单地返回库中的地址。 但是,尝试第二次加载时, DllMain不再调用DLL_PROCESS_ATTACH 。 图书馆意义上的句柄只是记忆的位置,所以你第二次得到的价值应该和第一次相同。

至于Linux的SO文件,我不明白他们为什么会加载两次。 但是,其他人将不得不权衡这个给你一个正确的答案。

对于Linux共享对象,从dlopen(3)页 :

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