如果我使用DLL API LoadLibrary连续3次加载相同的DLL,它应该返回3个不同的句柄,并且每个库中的函数都应该有不同的地址,对吗?(或者它是否做了一些“聪明”的事情,并检测是否已经为进程加载了dll,并且只是指向相同的模块?)
发布于 2010-08-17 05:31:20
它做了一些聪明的事情。Windows为通过LoadLibrary加载的每个动态链接库保留一个引用计数。这就是为什么您必须为每个相应的LoadLibrary调用调用一次FreeLibrary。假设你不先释放DLL,那么每次调用LoadLibrary都会给你相同的句柄。
来自FreeLibrary的MSDN文档:
每个进程都为每个加载的库模块维护一个引用计数。此引用计数在每次调用LoadLibrary时递增,在每次调用FreeLibrary时递减。
发布于 2010-08-17 05:32:23
如果它们是相同的DLL,那么它不会再次加载它。
http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx
“如果指定的模块是尚未为调用进程加载的DLL,系统将使用DLL_PROCESS_ATTACH值调用DLL的DllMain函数。如果DllMain返回TRUE,LoadLibrary将返回模块的句柄。如果DllMain返回FALSE,系统将从进程地址空间卸载DLL,而LoadLibrary将返回NULL。从DllMain调用LoadLibrary是不安全的。有关详细信息,请参阅DllMain中的备注部分。”
如果lpFileName不包括路径,并且有多个加载的模块具有相同的基本名称和扩展名,则此函数将返回最先加载的模块的句柄。
发布于 2010-08-17 05:36:35
为了解决这个问题,你可以将.dll复制到一个临时文件中(加载.dll所需的次数),然后在加载完成后删除这些文件。
https://stackoverflow.com/questions/3497516
复制相似问题