LoadLibrary是否创建不同的实例?

时间:2010-08-16 21:27:42

标签: winapi loadlibrary

如果我使用Win32 API LoadLibrary 连续3次加载相同的DLL,它应该返回3个不同的句柄,每个库中的函数应该都有不同的地址是否正确? (或者它是否执行“智能”操作并检测是否已为该进程加载了dll并且只指向同一模块?)

3 个答案:

答案 0 :(得分:23)

它做得很聪明。 Windows为通过LoadLibrary加载的每个DLL保留引用计数。这就是为什么你必须为每个相应的LoadLibrary调用调用FreeLibrary一次。假设你没有先释放DLL,每次调用LoadLibrary都会给你相同的句柄。

来自FreeLibrary的MSDN文档:

  

每个进程都为每个已加载的库模块维护引用计数。每次调用LoadLibrary时,此引用计数都会递增,并且每次调用FreeLibrary时都会递减。

答案 1 :(得分:6)

如果它们是同一个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不包含路径,并且有多个加载的模块具有相同的基本名称和扩展名,则该函数将返回首先加载的模块的句柄。”

答案 2 :(得分:4)

不,它没有。要解决此问题,您可以将.dll复制到临时文件中(根据需要加载.dll的次数),然后在完成后删除文件。