LoadLibrary是否创建不同的实例?

Use*_*902 21 winapi loadlibrary

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

Pet*_*man 23

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

从FreeLibrary的MSDN文档:

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

  • 请注意,如果使用解析到同一DLL的不同路径,则可以获取多个实例,但大多数人不会遇到此问题. (8认同)
  • 我的一般政策是永远不要调用 FreeLibrary。很高兴知道用户可以在同一个上多次调用 LoadLibrary,而不会造成不必要的泄漏。(在应用程序终止之前您真正希望多久卸载一次库?风险大于价值)。 (3认同)

Ben*_*son 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不包含路径,并且有多个加载的模块具有相同的基本名称和扩展名,则该函数将返回首先加载的模块的句柄."