让VS2013,DirectXMath,XAudio2和D3D11协同工作,目标是Windows 7

时间:2014-09-21 21:42:40

标签: c++ windows directx conflict

致力于将我的产品升级到新的编译器版本和新技术,但微软似乎已经弄得一团糟......

  • VS2013 / WinSDK附带的XAudio2版本在Windows 7上不起作用,并且没有编译标志可以解决这个问题(在8之前的值上有_WIN32_WINNT它甚至不包含它,将它设置得更高并且它的链接库无论如何都要寻找更新的DLL名称。)
  • 其他现有的DirectX组件,例如D3D11,在与其Win8 SDK标头和导入库一起使用时似乎很好。 Win7用户仍然需要安装d3d11.dll等的DirectX SDK版本。
  • 尝试将DirectX June 2010 SDK放入包含路径(以获得可用的XAudio2版本),会导致宏冲突,例如:在dxgitype.h和winerror.h之间。似乎Microsoft将大量宏移动到winerror.h中,并且在尝试定义它们之前没有预处理器检查......
  • DirectXMath标题似乎只出现在Windows8 SDK标题中,它们对Windows 7 _WIN32_WINNT = 0x0601没有任何问题,但是这个事实阻止我在没有winerror.h废话的情况下使用旧版SDK ...

我想知道我是否可以通过取消_WIN32_WINNT来包含Win8 XAudio2然后克隆DirectX SDK版本的内联COM包装器来破解它,但是如果任何XAudio2公共接口实际发生了变化(例如结构布局或新成员),我就会暴露)。

必须有一个正确的方法来执行此操作...如果我可以在Win8系统上使用操作系统提供的DLL而不是旧安全的DX redist(并且没有编译我的代码两次,我真的想要

,以避免在所有其他人之上单独使用win8 32/64桌面文件。)

1 个答案:

答案 0 :(得分:0)

确定发现C / C ++包含在初始测试中出现的解决方案黑客/解决方法。如果有人有正确的解决方案我喜欢那个

  1. 一般情况下,当人们安装DirectX SDK时,他们的Visual Studio最终会以$(DXSDK_DIR)结束,即使默认情况下它不在包含路径上,但就像我说的那样,只是把它放在第一位不起作用,所以......
  2. 在项目设置中将预处理器宏定义为“$(DXSDK_DIR)Include \ xaudio2.h”。
  3. 包括该宏以获取xaudio2.h的DXSDK版本,无论包含路径如何。这带来了一些乐趣,因为即使有完整的路径我也无法让MSVC提供引用值(它似乎在项目设置中剥离它周围的引号......)。
  4. 现在它抱怨“#include< comdecl.h>”,显然不是在Window的SDK中,因为XAudio2使用了<>它不会被收录在目录中。因此,无论如何都要将DXSDK_DIR \ Include添加到您的包含路径,在Windows SDK之后
  5. 奇怪的是,comdecl.h中的任何内容都不会与任何内容(我至少包含在内)发生冲突,并且这些内容完全编译和链接,并在Window 7系统上运行(未在Windows 8上测试,并且肯定没有测试,如果我可以使用我自己的LoadLibrary / etc代码路径加载WinA版本的XAudio DLL)
  6. 包括宏

    #define INCLUDE_XAUDIO2_EXPAND(path) <path>
    #include INCLUDE_XAUDIO2_EXPAND(INCLUDE_XAUDIO2)
    

    编辑:这也似乎打破了IDE错误检测和自动完成,似乎无法处理包括...