【问题标题】:LoadLibrary never returning in visual studio 2013 c++ projectLoadLibrary 永远不会在 Visual Studio 2013 C++ 项目中返回
【发布时间】:2016-10-13 12:11:11
【问题描述】:

我编写了一个静态库,它依赖于 3 个库 a.lib、b.lib、c.dll。现在我已经编写了一个测试项目,它适用于这个项目。但是还有另一个项目在它的一个 dll 中包含这个静态库,比如 x.dll,然后在项目中使用这个 dll。

现在,当项目尝试使用 LoadLibrary 加载 x.dll 时,它永远不会返回并继续等待。我将 c.dll b.lib 和 a.lib 都保留在同一位置,但仍然无法加载。 尝试使用依赖walker,但在包含此库之前和之后看不到太大差异。

我应该如何确定问题? 我可以在 .lib 中包含所有依赖项吗?我觉得因为它是静态库,所以它本身应该包含所有依赖项。 在此先感谢您的帮助。 该项目是visual studio 2013中的visual c++。

【问题讨论】:

  • 看到您的程序在 LoadLibrary() 上死锁只有一种解释:您在 DllMain() 入口点中放置了太多代码。谷歌“dllmain loader lock”获取基本帮助。

标签: c++ visual-studio dll static-libraries


【解决方案1】:

LoadLibrary 调用 DLL 文件的 DllMain()。它就像 DLL 的 main()DllMain 一定有什么死机。

注意:有时 DLL 的代码中没有DllMain,但编译器会自动创建一个用于使用构造函数初始化全局变量,这也可能导致问题。

为了澄清,您可以使用 LoadLibraryExDONT_RESOLVE_DLL_REFERENCES 设置。该标志将禁用DllMain 并禁用加载依赖项。如果成功,则问题出在DllMain。 (但你现在不能使用 DLL,几乎所有现代 DLL 在没有 DllMain 的情况下都会表现得不正确)

要调试,你可以在Ntdll.LdrpCallInitRoutine 上断点,DllMain() 在这个函数中被调用。

【讨论】:

  • 谢谢科宇。实际上,问题似乎出在 DllMain 上。我使用了设置了 DONT_RESOLVE_DLL_REFERENCES 的 LoadLibraryEx,它能够加载库。但是我该如何摆脱这个问题呢?你说这个DLL将无法使用。我可以以某种方式编译我的库以使其与 LoadLibrary 本身一起使用吗?
  • 是的,你可以。但是你需要修改很多代码。 1)您需要将项目类型从静态库更改为动态库。 2) 使用 dllexport 描述符标记所有公共函数、成员、类,您可能需要创建一个额外的 exports.def 来阐明导出的内容。并重新编译它。 3)将头文件和lib(它们仅引用DLL,与静态文件不同)文件链接到您的项目。 4) 如果确实需要使用 LoadLibrary 而不是 lib 文件,则需要将所有导出的函数声明为函数指针。并调用 GetProcAddress 来填充它们。
  • 此外,您可以尝试使用“无法使用”的 dll。在极少数时候,就可以使用了。
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 2022-07-19
  • 2014-06-13
  • 1970-01-01
  • 2019-11-15
  • 2011-07-25
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多