Visual c++ 找不到LoadLibrary模块-Office 2007安装后的DLL地狱

Visual c++ 找不到LoadLibrary模块-Office 2007安装后的DLL地狱,visual-c++,dll,loadlibrary,Visual C++,Dll,Loadlibrary,不幸的是,这将是一个非常开放的问题,但我已经束手无策,我想我会寻求一些建议 这是Visual C++ MFC应用程序使用Visual Studio 2008 SP1../P> 我和一位同事都安装了Office2007,从那以后我们的应用程序都出现了奇怪的DLL加载问题。具体地说,LoadLibrary未能加载我们的DLL(它加载的第一个DLL),并返回错误代码126(找不到模块)。真正奇怪的是,如果我只是从windows资源管理器运行可执行文件,它就可以正常工作 我采取了通常的步骤来诊断问题:

不幸的是,这将是一个非常开放的问题,但我已经束手无策,我想我会寻求一些建议

这是Visual C++ MFC应用程序使用Visual Studio 2008 SP1../P> 我和一位同事都安装了Office2007,从那以后我们的应用程序都出现了奇怪的DLL加载问题。具体地说,LoadLibrary未能加载我们的DLL(它加载的第一个DLL),并返回错误代码126(找不到模块)。真正奇怪的是,如果我只是从windows资源管理器运行可执行文件,它就可以正常工作

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

  • 验证文件是否存在,以及当前工作目录是否指向该文件
  • 运行dependency walker并验证其依赖项是否正确加载。他们都加载正常,除了那些说可以失败的
  • 尝试在代码中的同一位置加载一些不同的DLL。一些简单的“存根”DLL成功了,但大多数都失败了
  • 尝试从单独的测试应用程序加载失败的DLL-在空的控制台应用程序和裸体MFC应用程序中,所有DLL都可以正常加载
  • 尝试使用LoadLibraryEx和load_LIBRARY_AS_DATAFILE标志加载DLL,这确实成功,但除了指出这可能是一个依赖性问题之外,我们并没有走多远
  • 现在我真的不知道还能做什么。正如我所说,Office2007是我们问题中的一个共同点,但我不知道它会造成什么样的问题。我真的不知道下一步该怎么办。有什么想法吗

    编辑:由于某种原因,我非常确定当前工作目录不在DLL路径中。似乎出现故障的DLL是那些需要任何其他DLL的DLL。如果启用加载程序快照调试输出,则当前工作目录似乎不在DLL加载路径中。你知道这是什么原因吗


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

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

    Office 2007在注册表中打开SafeDllSearchMode

    使用SafeDlLSearchMode,将不再搜索当前目录。要禁用它,他们声称您可以进入regedit并将HKLM/System/CurrentControlSet/Control/SessionManager/SafeDllSearchMode设置为0,但这对我不起作用。将SetDllDirectory调用到当前目录对我来说是可行的,尽管这只适用于目标为xpsp1+的情况

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


    尽管如此,微软还是很难像这样更改我们的dll搜索路径。

    根据我最初提供的信息,这是一个合理的猜测,但我编辑了更多信息,指出了某种加载路径混乱/错误。