代码之家  ›  专栏  ›  技术社区  ›  Bill Prin

找不到LoadLibrary模块-安装Office2007之后的dll外壳程序

  •  0
  • Bill Prin  · 技术社区  · 16 年前

    不幸的是,这将是一个相当开放的问题,但我在我的智慧的尽头,我想我会寻求一些建议。

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

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

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

    1. 验证文件是否存在以及当前工作目录是否指向该文件。
    2. 运行DependencyWalker并验证它的依赖项是否正确加载。除了那些外,其他的都装好了 this question 说可以失败。
    3. 尝试在代码的同一位置加载一些不同的DLL。一些简单的“存根”DLL成功,但大多数都失败了。
    4. 尝试从单独的测试应用程序加载失败的DLL-在一个空控制台应用程序和一个准骨骼的MFC应用程序中,所有的DLL都加载良好!
    5. 尝试用loadLibraryEx和loadLibrary作为数据文件标志加载DLL,这确实成功,但除了指出这可能是一个依赖性问题外,不会让我们走得太远。

    我真的不知道在这一点上还能做什么。正如我所说,Office2007是我们问题中的一个常见主题,但我不知道它会产生什么样的问题。我真的不知道下一步该怎么做。有什么想法吗?

    编辑:我很确定当前工作目录不在dll路径中,因为某种原因。似乎失败的DLL需要任何其他的DLL。如果我打开加载程序快照调试输出,当前工作目录似乎不在dll加载路径中。知道是什么导致的吗?

    edit2:当前生成将可执行文件转储到工作目录以外的目录中。出于某种原因,当我尝试加载一个dll,然后尝试加载另一个dll时,将不再搜索当前工作目录。通过将可执行文件与我尝试加载的所有DLL放在目录中,问题就消失了。基于所有这些,加上加载器快照的输出,我有98%的确信这是一个奇怪的Visual Studio bug,我只需要解决它。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Bill Prin    16 年前

    Office2007在注册表中打开SafeDLLSearchMode。

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

    使用safedllsearchmode时,将不再搜索当前目录。要禁用它,他们声称您可以进入regedit并将hklm/system/currentcontrolset/control/sessionmanager/safedllsearchmode设置为0,但这对我不起作用。将setdllddirectory调用到当前目录对我来说确实有效,尽管这仅在您目标是xp sp1+时有效。

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

    不过,对于微软来说,像这样改变我们下面的dll搜索路径还是相当令人困惑的。

        2
  •  0
  •   joekoyote    16 年前

    失败的dll是否在依赖项中包含msvcrt80?如果是,最可能的原因是Office2007已重写msvcr80.dll