0

不幸的是,这将是一个非常开放的问题,但我无能为力,我想我会寻求一些建议。

这是一个使用 Visual Studio 2008 SP1 的 Visual C++ MFC 应用程序。

我和一位同事都安装了 Office 2007,从那以后我们的应用程序都遇到了奇怪的 DLL 加载问题。具体来说,LoadLibrary 未能加载我们的一个 DLL(它加载的第一个)并返回错误代码 126(未找到模块)。真正奇怪的是,如果我只是从 Windows 资源管理器运行可执行文件,它就可以正常工作。

我采取了通常的步骤来诊断问题:

  1. 验证文件是否存在以及当前工作目录是否指向它。
  2. 运行dependency walker 并验证它的依赖项是否正确加载。除了这个问题说可以失败的那些之外,它们都加载正常。
  3. 尝试在代码中的同一位置加载一些不同的 DLL。一些简单的“存根”dll 成功了,但大多数都失败了。
  4. 尝试从单独的测试应用程序加载失败的 DLL - 在空的控制台应用程序和准系统 MFC 应用程序中,所有 DLL 都可以正常加载!
  5. 尝试使用 LoadLibraryEx 和 LOAD_LIBRARY_AS_DATAFILE 标志加载 DLL,这确实成功但并没有让我们走得太远,除了指出它可能是一个依赖问题。

我真的不知道在这一点上还能做什么。就像我说的,Office 2007 是我们问题中的一个常见问题,但我不知道它会产生什么样的问题。我真的不知道接下来要采取什么步骤。有任何想法吗?

编辑:我很确定当前工作目录由于某种原因不在 DLL 路径中。似乎失败的 DLL 是需要任何其他 DLL 的 DLL。如果我打开 Loader Snaps 调试输出,当前工作目录似乎不在 DLL 加载路径中。知道是什么原因造成的吗?

edit2:当前构建将可执行文件转储到工作目录以外的目录中。出于某种原因,当我尝试加载一个 DLL 然后尝试加载另一个 DLL 时,不再搜索当前工作目录。通过将可执行文件放入包含我要加载的所有 DLL 的目录中,问题就消失了。基于所有这些,以及加载程序快照的输出,我 98% 确信这是一些奇怪的 Visual Studio 错误,我将不得不解决它。

4

2 回答 2

1

Office 2007 在注册表中打开 SafeDllSearchMode。

http://msdn.microsoft.com/en-us/library/ms682586%28VS.85%29.aspx

使用 SafeDlLSearchMode,不再搜索当前目录。要禁用它,他们声称您可以进入 regedit 并将 HKLM/System/CurrentControlSet/Control/SessionManager/SafeDllSearchMode 设置为 0,但这对我不起作用。将 SetDllDirectory 调用到当前目录 DID 对我有用,尽管这仅在您以 XP SP1+ 为目标时才有效。

这在我的特定应用程序中引起问题的原因是,当我们从调试器运行可执行文件时,我们将可执行文件保存在与所有其他构建文件的当前目录不同的目录中。当我们在 Visual Studio 之外运行时,我们首先将可执行文件复制到包含所有其他 DLL 的目录中。调用原始可执行文件的目录始终位于搜索路径中,因此如果将可执行文件和 dll 放在一起,则永远不会遇到此问题。

尽管如此,微软这样改变我们下面的dll搜索路径还是相当令人困惑的。

于 2010-08-23T20:36:14.157 回答
0

失败的 DLL 是否具有 MSVCRT80 依赖项?如果是,最可能的原因是 Office 2007 已覆盖 MSVCR80.dll

于 2010-08-23T19:33:18.677 回答