【问题标题】:C++ verifying the version of directx on Windows Vista OSC++ 在 Windows Vista 操作系统上验证 directx 的版本
【发布时间】:2018-08-20 00:58:18
【问题描述】:

我想在不同的操作系统上进行测试,Windows Vista、Windows Vista SP1、Windows Vista SP2、Windows 2012R2、Windows 7、Windows 8、Windows 10 等,是否有可能使用 Direct3D 11 图形技术。

在 msdn 上某处发现确保操作系统可以使用此技术的最佳方法是调用 D3D11CreateDevice 并检查结果。

如果您在没有服务包的 Windows Vista 上运行此代码,它甚至不会启动,因为没有 d3d11.dll。原来要检查是否支持 Direct3D 11 Graphics 技术,你需要同样的技术吗?

#include "stdafx.h"
#include "windows.h"
#include "dxgi.h"
#include "d3d11.h"

BOOL IsDirectx11Available()
{
    D3D_FEATURE_LEVEL lvl[] = {
        D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 };

    DWORD createDeviceFlags = 0;

    ID3D11Device *device;
    ID3D11DeviceContext *context;
    D3D_FEATURE_LEVEL fl;

    HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,
        createDeviceFlags, lvl, _countof(lvl),
        D3D11_SDK_VERSION, &device, &fl, &context);

    if (hr == E_INVALIDARG)
    {
    hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,
        createDeviceFlags, &lvl[1], _countof(lvl) - 1,
        D3D11_SDK_VERSION, &device, &fl, &context);

    return false;
}

return true;
}
int main()
{
if (IsDirectx11Available())
{
    printf("Directx api available\n");
}

system("PAUSE");
return 0;
}

也试过了

DWORD dwVersion;
DWORD dwRevision;
if (DirectXSetupGetVersion(&dwVersion, &dwRevision))
{
    printf("DirectX version is %d.%d.%d.%d\n",
           HIWORD(dwVersion), LOWORD(dwVersion),
           HIWORD(dwRevision), LOWORD(dwRevision));
}

使用来自 directx sdk 的 dsetup.h、dsetup.lib。但是当我朗姆酒 .exe 时,它会显示未找到 dsetup.dll 的通知。

如何摆脱这种情况并检查 Windows Vista 的可用性?

【问题讨论】:

  • 正确的方法是在你的安装程序中检查这类东西
  • @AlanBirtles,如果此选项不可用?

标签: c++ directx


【解决方案1】:

您列出的每个操作系统都有一个特定的 DirectX 版本,具体取决于操作系统编号。除了两个特定更新之外,您无法更改系统上的 DirectX 版本,因此在大多数情况下没有什么可以“检测”到的。运行 DirectX End-User Runtime 根本不会更改任何这些操作系统上的 DirectX 版本。

Windows XP SP2     |     DirectX 9.0c
Windows XP SP3     |     DirectX 9.0c
Windows Vista RTM  |     DirectX 10.0
Windows Vista SP1  |     DirectX 10.1
Windows Vista SP2  |     DirectX 10.1 or DirectX 11.0 (KB 971644)
Windows 7 RTM      |     DirectX 11.0
Windows 7 SP1      |     DirectX 11.0 or DirectX 11.1 (KB 2670838)
Windows 8          |     DirectX 11.1
Windows 8.1        |     DirectX 11.2
Windows 10         |     DirectX 12 (build number will determine specifics)

从 Windows Server 2003 SP1 开始,服务器操作系统等效项是相同的(并且具有相同的版本号)。

请记住,这只会告诉您存在哪些操作系统软件 API。您必须尝试创建 Direct3D 设备并检测它的 Direct3D 硬件功能级别,以了解有关连接到系统的视频卡/驱动程序的任何信息。见Direct3D Feature Levels

要解决在未更新的 Windows Vista 系统上缺少d3d11.dll 的问题,您需要使用显式 DLL 链接(又名LoadLibrary)或DLL delay loading

dsetup.dll 仅在旧版 DirectX SDK 中,并且是已弃用的 DirectX 最终用户运行时包中的并行内容的一部分。这就是为什么它没有出现在您的所有机器上的原因。见MSDN。旧版 DirectSetup API 从未针对 DirectX 10 或更高版本进行更新,因此它仍然报告与它始终相同的 9.0c 编号。

请参阅以下博客文章:Not So Direct SetupWhat’s in a version number?Manifest Madness

几个脚注:

  • 从 Windows Vista RTM 或更高版本开始,作为后续运行时中包含的“DirectX 9.0c”组件的一部分,没有 Direct3D 保留模式、DirectPlay 语音或 DX7/DX8 Visual Basic 支持。

  • 从 Windows 8.1 或更高版本开始,默认情况下不安装 DirectPlay。这是一个必须启用的 Windows 可选功能。

【讨论】:

    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多