我想你需要将其从DirectX11的对象转换,是的,但你可以做到这一点,而不使用正常的COM QueryInterface
例如,使用ComObj<>
辅助包装:
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();
}
但在任何情况下使用辅助包装可能更容易。
我的答案很大程度上是关于COM引用计数处理和我的代码片段是基于我认为从MSDN的示例。然而,anonymous user points out这并不是创建其中一个对象的很好的实际示例:
创建D3D11.1设备需要指定要素级数组。请参阅D3D11CreateDevice上的MSDN页面。另外,D3D_DRIVER_TYPE_NULL是没有渲染能力的参考设备,不太可能是原始海报所需的。
他建议你用
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,
等希望这是有用的附加功能级别的数据并传递到D3D11CreateDevice
调用一起 - 我不知道该API不够好,真的发表评论。
来源
2013-02-11 13:45:59
Rup
?这真的是强制性的吗?我期望它只是一个包装器,可以像ATL的CComPtr一样管理引用计数,而且可以作为QueryInterface的包装器。 – Rup 2013-02-11 01:20:17
但是,您将如何创建11.1设备?我理解它的方式,没有办法直接创建一个,你必须使用As()来转换一个D3D11设备。 – SvalinnAsgard 2013-02-11 01:56:14