【问题标题】:Sometimes LoadLibrary fail with error code 126有时 LoadLibrary 失败,错误代码为 126
【发布时间】:2018-02-12 08:23:16
【问题描述】:

目前,我正在使用 LoadLibrary 函数来加载我的 xxx.dll 文件(xxx.dll 是我的私有 dll 文件)。它可以正常工作,但是有时无法加载库,错误代码为 126。

MyDll = LoadLibrary(DllPath.c_str());

DllPath(std::wstring 类型)是我的 dll 文件的路径。

我研究了错误,它的意思是“找不到模块”,但是我检查了目录是正确的,dll文件仍然存在。

我的 dll 文件是 32 位 dll,操作系统是 windows 64 位,启动服务时会加载 dll 文件。

这种情况很少发生,目前我无法重现此错误。 但是,每当发生错误时,总是无法加载 dll 文件,只有一种方法可以解决此问题,即删除并重新安装软件。

有谁知道这个问题的可能原因是什么?

感谢任何帮助!

【问题讨论】:

  • 您是如何检查目录是否正确的?程序在哪里?
  • 这也发生在我身上,虽然乍一看它似乎是完全随机的,但如果 DLL“最近没有加载”,我实际上从未见过它失败。我当前的解决方法是运行while 循环(尝试次数最多),直到成功加载 DLL,并在尝试之间随机休眠(持续时间 10-1000 毫秒,对我来说不是问题,因为我在专用于加载大型 DLL 的线程,无论如何这都会阻塞一段不平凡的时间)。
  • @TheTechel : 当问题发生在我的电脑上时,我打印了一个 dll 文件目录的日志,它是正确的,我还有一个检查 dll 文件是否仍然存在的功能。跨度>
  • @JohnWeisz :我还有一个 while 循环来加载 dll 文件,直到成功加载 DLL 并且在尝试之间有一个睡眠时间,但是,它无法重新加载几天,只有当我加载重新安装我的软件。
  • @TheTechel : 程序位于 C:\Program Files (x86)\software 的文件夹中

标签: c++ dll service loadlibrary


【解决方案1】:

我曾经在使用私有 DLL 时遇到过这个问题;我有一个针对私有 DLL 执行 LoadLibrary 的测试程序,我收到错误 126。我查看了它并能够修复错误:

这似乎是因为静态链接与动态链接针对 DLL 的依赖项。更具体地说,私有 DLL 依赖于 OpenCV,并链接到以下文件:

zlib.lib, ippicvmt.lib, ippiw.lib, ade.lib, opencv_core410.lib, opencv_imgcodecs410.lib, opencv_imgproc410.lib, ittnotify.lib, IlmImf.lib, libjpeg-turbo.lib, @98654332@, @98654332 、libprotobuf.lib、libtiff.lib、libwebp.lib、quirc.lib

这些 OpenCV 库文件可以以“静态”模式或“动态”模式构建。当这些文件以“动态”模式构建时,私有 DLL 的LoadLibrary 给出错误 126。当 OpenCV 以“静态”模式构建时,所有 OpenCV 例程将成为私有 DLL 的一部分,私有 DLL 变得更大( 28 MB vs 41 MB),并且可以通过一次 LoadLibrary 调用正确加载私有 DLL。

其他一些发现:

  • 我的私有 DLL 使用 Unicode 编码,而 OpenCV 是使用多字节编码构建的。这种组合效果很好。
  • 我的操作系统是 64 位的,我的私有 DLL 是 32 位的,而 OpenCV 是 32 位的。私有 DLL 的位数需要与其依赖项 OpenCV 的位数相匹配。
  • 在调试模式下构建私有 DLL 和 OpenCV 时,OpenCV 的迭代器调试级别和私有 DLL 必须匹配。当两者都以发布模式构建时,此问题不存在。在混合匹配调试模式和发布模式时也应该注意这个问题。

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2020-07-12
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多