有时LoadLibrary失败,错误代码为126

时间:2018-02-12 08:23:17

标签: c++ dll service loadlibrary

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

MyDll = LoadLibrary(DllPath.c_str());

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

我研究了错误,这意味着"无法找到模块" ,但我检查了目录是否正确,dll文件是否仍然存在。

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

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

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

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我曾经用私有DLL遇到过这个问题;我有一个针对私有DLL执行LoadLibrary的测试程序,但出现错误126。我对其进行了研究,并能够修复该错误:

出现这种情况是因为针对DLL的依赖项进行了静态与动态链接。更具体地说,私有DLL取决于OpenCV,并链接到以下文件:

zlib.libippicvmt.libippiw.libade.libopencv_core410.libopencv_imgcodecs410.libopencv_imgproc410.libittnotify.libIlmImf.liblibjasper.liblibjpeg-turbo.liblibpng.liblibprotobuf.liblibtiff.liblibwebp.libquirc.lib

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

其他一些发现:

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