Visual c++ DirectX 11.1和Win32桌面

Visual c++ DirectX 11.1和Win32桌面,visual-c++,directx,directx-11,Visual C++,Directx,Directx 11,我在理解DirectX 11.1时有点困难。我对使用它构建传统的Win32桌面程序感兴趣,但所有文档都是针对metro应用程序的。11.1是否仅适用于metro应用程序?我认为这并不是因为Windows7增加了对11.1的支持 在过去,我初始化D3D11没有问题。这是简单的声明指针然后调用函数在标准C++时尚: ID3D11Device *pDevice; 现在有了11.1,有了一大堆新东西,比如ComPtr: ComPtr<ID3D11Device1> pDevice; 我们不

我在理解DirectX 11.1时有点困难。我对使用它构建传统的Win32桌面程序感兴趣,但所有文档都是针对metro应用程序的。11.1是否仅适用于metro应用程序?我认为这并不是因为Windows7增加了对11.1的支持

在过去,我初始化D3D11没有问题。这是简单的声明指针然后调用函数在标准C++时尚:

ID3D11Device *pDevice;
现在有了11.1,有了一大堆新东西,比如ComPtr:

ComPtr<ID3D11Device1> pDevice;
我们不创建D3D11.1设备,而是使用ComPtr作为功能从D3D11转换设备,因此强制要求ComPtr

假设桌面可以进行DX11.1开发,有没有一种方法可以使用传统的初始化而不进行这种转换

如果没有办法,如何为桌面初始化D3D11.1


谢谢。

我认为您确实需要将其从DirectX11对象转换过来,是的,但是您可以使用普通COM查询接口,而无需使用ComObj帮助程序包装来完成此操作,例如:


等。希望这是有用的-我对API不太了解,无法进行真正的评论。

我认为您确实需要将其从DirectX11对象转换为DirectX11对象,是的,但是您可以使用普通的COM查询接口,而无需使用ComObj帮助器包装来完成此操作,例如:


等等。希望这是有用的-我对API还不太了解,无法真正发表评论。

?这真的是强制性的吗?我希望它只是一个包装器来为您管理引用计数,就像ATL的CComPtr一样,还有.QueryInterface的包装器。但是您如何创建11.1设备呢?按照我的理解,没有办法直接创建一个,您必须使用As转换D3D11设备。?这真的是强制性的吗?我希望它只是一个包装器来为您管理引用计数,就像ATL的CComPtr一样,还有.QueryInterface的包装器。但是您如何创建11.1设备呢?按照我的理解,没有办法直接创建一个,您必须使用As转换D3D11设备。谢谢,这是一个很好的答案。我将使用ComPtr我的问题是,我认为它是metro SDK的一部分,因此需要愚蠢的许可证,并且必须为metro编写。但这是完全错误的,它与经典的桌面程序配合得很好。顺便说一句,我有一个应用程序试图在Windows7上使用功能级别11_1,而驱动程序一直疯狂地崩溃,因为它不知道枚举值。顺便说一句,据我所知,11_1仅适用于Windows 8及以上版本。谢谢,这是一个很好的答案。我将使用ComPtr我的问题是,我认为它是metro SDK的一部分,因此需要愚蠢的许可证,并且必须为metro编写。但这是完全错误的,它与经典的桌面程序配合得很好。顺便说一句,我有一个应用程序试图在Windows7上使用功能级别11_1,而驱动程序一直疯狂地崩溃,因为它不知道枚举值。顺便说一句,据我所知,11_1仅适用于Windows 8及以上版本。
ID3D11Device* device = NULL;
D3D_FEATURE_LEVEL level;
ID3D11DeviceContext* context = NULL;

HRESULT hr = D3D11CreateDevice(NULL, 
    D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_NULL, 
    NULL,
    0, 
    NULL, 
    0, 
    D3D11_SDK_VERSION, 
    &device, 
    &level, 
    &context);
if (SUCCEEDED(hr))
{
    ID3D11Device1* device1 = NULL;
    // This is equivalent to the ComPtr<>.As<>()
    hr = device->QueryInterface(IID_ID3D11Device1, (void**)&device1);
    if (SUCCEEDED(hr) && (device1 != NULL))
    {
        // device1 now ready

        // when finished with device1
        // (this would be handled automatically by the ComPtr<> destructor)
        device1->Release();
    }

    device->Release();
    context->Release();
}
ID3D11Device1* pDevice1 = device.As<ID3D11Device1>().Detach();
if (pDevice1 != NULL)
{
    // use as before
    // you'll then need to release manually since we detached the reference
    pDevice1->Release();
}
D3D_FEATURE_LEVEL pFeatureLevels[]={D3D_FEATURE_LEVEL_11_1};
UINT nFeatureLevels=ARRAY_SIZE(pFeatureLevels);

HRESULT hr = D3D11CreateDevice(NULL, 
    D3D_DRIVER_TYPE::D3D_DRIVER_TYPE_HARDWARE, /* was NONE in example I copied */
    NULL,
    0, 
    pFeatureLevels, /* was NULL */
    nFeatureLevels, /* was 0 */
    D3D11_SDK_VERSION,