14

我的项目是一个独立的 C++ 应用程序,它使用 FMOD 播放声音。我之前用 Visual Studio 2010 开发过相同的项目没有任何问题,但是 2012 给了我一个经典错误:“程序无法启动,因为您的计算机中缺少 fmodex.dll。尝试重新安装程序以解决此问题。 " 该项目似乎可以很好地加载其他 DLL(例如 Direct3d 相关文件和 d3d 着色器编译器)。

仅当尝试从 IDE 调试或运行程序时才会出现此问题,而不是当我使用 DLL 将可执行文件复制到适当的目录并手动运行它时。如果我从程序中删除所有对 FMOD 的引用,则调试和运行正常。我已经确保我在项目设置中有正确的工作目录(除了它在同一目录中加载所有其他文件就好了)。我最初是从 Visual Studio 2010 转换项目,但尝试从头开始创建一个新项目,但没有成功。我还修改了所有可能的编译器和链接器设置,谷歌搜索似乎也没有帮助。

我猜这个问题与新的 Metro 风格应用程序有关,它是处理外部依赖的方式,但我也关闭了“Metro 风格应用程序支持”。我开始认为我真的已经尽我所能尝试了,但不知道下一步该尝试什么。获得更多诊断信息的指导也将不胜感激!谢谢!

编辑:我使用的 Visual Studio 版本是 Visual Studio Ultimate 2012 RC,版本 11.0.50706.0 QRELRC,2012 年 7 月

4

3 回答 3

24

转到项目的属性:

Configuration Properties | Debugging | Environment 

并添加以下项目:

PATH=c:\path\where\the\dll-is;$(Path)
于 2012-09-21T05:55:34.983 回答
2

我的同情,我最近似乎生活在 DLL 地狱中。两个建议:

  1. devenv您可以从带有/useenv开关的命令行驱动 IDE 。

    "... 使用 PATH、INCLUDE、LIBPATH 和 LIB 环境变量,而不是 VC++ 构建的 IDE 路径。

  2. dumpbin /dependents [*.exe] [*.dll]将向您显示 DLL 依赖项。

    dumpbin /dependents openssl.exe

Microsoft (R) COFF/PE Dumper 版本 10.00.40219.01 版权所有 (C) Microsoft Corporation。版权所有。文件转储 openssl.exe

文件类型:可执行图像

图像具有以下依赖项:

SSLEAY32.dll
LIBEAY32.dll
WSOCK32.dll
MSVCR80.dll
KERNEL32.dll

Summary

     4000 .data
    14000 .rdata
     1000 .rsrc
    33000 .text 
于 2012-09-21T05:34:50.190 回答
0

可能是 VS 正在使用与手动运行应用程序时不同的当前目录运行应用程序。

VS 通常将当前目录设置为项目文件夹,该文件夹通常与构建的二进制文件所在的文件夹不同。当您手动运行它时,您可能是从后者而不是前者运行它。

如果这是问题所在,那么加载 fmodex.dll 的代码必须取决于 DLL 搜索路径中的当前目录,这可能会带来很大的安全风险(查找“DLL 种植”或 DLL“预加载”),并且被某些 Windows 配置主动阻止。

于 2012-09-20T20:25:36.330 回答