不幸的是,这将是一个非常开放的问题,但我无能为力,我想我会寻求一些建议。
这是一个使用 Visual Studio 2008 SP1 的 Visual C++ MFC 应用程序。
我和一位同事都安装了 Office 2007,从那以后我们的应用程序都遇到了奇怪的 DLL 加载问题。具体来说,LoadLibrary 未能加载我们的一个 DLL(它加载的第一个)并返回错误代码 126(未找到模块)。真正奇怪的是,如果我只是从 Windows 资源管理器运行可执行文件,它就可以正常工作。
我采取了通常的步骤来诊断问题:
- 验证文件是否存在以及当前工作目录是否指向它。
- 运行dependency walker 并验证它的依赖项是否正确加载。除了这个问题说可以失败的那些之外,它们都加载正常。
- 尝试在代码中的同一位置加载一些不同的 DLL。一些简单的“存根”dll 成功了,但大多数都失败了。
- 尝试从单独的测试应用程序加载失败的 DLL - 在空的控制台应用程序和准系统 MFC 应用程序中,所有 DLL 都可以正常加载!
- 尝试使用 LoadLibraryEx 和 LOAD_LIBRARY_AS_DATAFILE 标志加载 DLL,这确实成功但并没有让我们走得太远,除了指出它可能是一个依赖问题。
我真的不知道在这一点上还能做什么。就像我说的,Office 2007 是我们问题中的一个常见问题,但我不知道它会产生什么样的问题。我真的不知道接下来要采取什么步骤。有任何想法吗?
编辑:我很确定当前工作目录由于某种原因不在 DLL 路径中。似乎失败的 DLL 是需要任何其他 DLL 的 DLL。如果我打开 Loader Snaps 调试输出,当前工作目录似乎不在 DLL 加载路径中。知道是什么原因造成的吗?
edit2:当前构建将可执行文件转储到工作目录以外的目录中。出于某种原因,当我尝试加载一个 DLL 然后尝试加载另一个 DLL 时,不再搜索当前工作目录。通过将可执行文件放入包含我要加载的所有 DLL 的目录中,问题就消失了。基于所有这些,以及加载程序快照的输出,我 98% 确信这是一些奇怪的 Visual Studio 错误,我将不得不解决它。