【问题标题】:Loading a dll with LoadLibrary使用 LoadLibrary 加载 dll
【发布时间】:2012-05-11 09:51:22
【问题描述】:

如果我使用LoadLibrary 加载一个DLL,该DLL 是否保证保持加载状态?如果没有,如何防止重新加载。

实际情况:我有一个调度程序,根据某些消息,它需要加载几个 dll 中的一个并从中执行一些功能。我无法在编译时链接它们,所以我使用LoadLibrary。因为可能有很多电话,我不想每次都打电话给LoadLibrary,因为事实证明这是一个瓶颈。所以我想每个 DLL 只调用一次,调用GetProcAddress 来获取函数,每个 dll 也只调用一次,并将其缓存在某个地方。但它安全吗?我是否保证在任何后续调用中调用该函数都可以?如果没有,我怎么能有这个保证?

【问题讨论】:

标签: c++ visual-c++ dll loadlibrary dynamic-loading


【解决方案1】:

LoadLibrary 增加可执行文件的引用计数,而 FreeLibrary 减少它。

当引用计数达到 0 时,可执行文件被卸载。所以你通常不必担心它。只要在您的进程中没有人调用 FreeLibrary,Dll 就会一直留在那里。

【讨论】:

    【解决方案2】:

    如果您阅读 MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx,它会说明如果 dll 尚未加载会发生什么行为,以及如果 dll 已经加载会发生什么情况,因此您不必担心这种开销。

    如果指定的模块是一个尚未加载的 DLL 调用进程,系统调用 DLL 的 DllMain 函数 DLL_PROCESS_ATTACH 值。如果 DllMain 返回 TRUE,则 LoadLibrary 返回 模块句柄。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多