首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LoadLibrary会创建不同的实例吗?

LoadLibrary会创建不同的实例吗?
EN

Stack Overflow用户
提问于 2010-08-17 05:27:42
回答 3查看 11.2K关注 0票数 24

如果我使用DLL API LoadLibrary连续3次加载相同的DLL,它应该返回3个不同的句柄,并且每个库中的函数都应该有不同的地址,对吗?(或者它是否做了一些“聪明”的事情,并检测是否已经为进程加载了dll,并且只是指向相同的模块?)

EN

回答 3

Stack Overflow用户

发布于 2010-08-17 05:31:20

它做了一些聪明的事情。Windows为通过LoadLibrary加载的每个动态链接库保留一个引用计数。这就是为什么您必须为每个相应的LoadLibrary调用调用一次FreeLibrary。假设你不先释放DLL,那么每次调用LoadLibrary都会给你相同的句柄。

来自FreeLibrary的MSDN文档:

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

票数 25
EN

Stack Overflow用户

发布于 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不包括路径,并且有多个加载的模块具有相同的基本名称和扩展名,则此函数将返回最先加载的模块的句柄。

票数 8
EN

Stack Overflow用户

发布于 2010-08-17 05:36:35

为了解决这个问题,你可以将.dll复制到一个临时文件中(加载.dll所需的次数),然后在加载完成后删除这些文件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3497516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档