1. ホーム
  2. c++

[解決済み] ComPtr でラップされた Direct3D 11 ポインタを使用して 11.1 インターフェースを取得するにはどうすればよいですか?

2022-01-28 18:38:33

質問内容

チュートリアルに沿って、この行まで通常の初期化をComPtrsを使うように変換しました。

ID3D11Device*           g_pd3dDevice = nullptr;
ID3D11Device1*          g_pd3dDevice1 = nullptr;
// Obtain the Direct3D 11.1 versions if available
hr = g_pd3dDevice->QueryInterface( __uuidof( ID3D11Device1 ), reinterpret_cast<void**>( &g_pd3dDevice1 ) );

ここで、私が期待したのは、ストレートアナログです。

Microsoft::WRL::ComPtr<ID3D11Device>    device = nullptr;
Microsoft::WRL::ComPtr<ID3D11Device1>   device1 = nullptr;
// Obtain the Direct3D 11.1 versions if available
hr = device->QueryInterface(__uuidof(ID3D11Device1), reinterpret_cast<ID3D11Device1**>(&device1));

コンパイラとIntellisenseの警告がいくつも出ています(私には本当に不可解です)。キャストが気に入らない、QueryInterface()の使い方が気に入らないというものです。

どうすればいいのでしょうか?

エラーです。

Error   1   error C2440: 'reinterpret_cast' : cannot convert from 'Microsoft::WRL::Details::ComPtrRef<Microsoft::WRL::ComPtr<ID3D11Device1>>' to 'ID3D11Device1 **'
Error   2   error C2660: 'Microsoft::WRL::Details::RemoveIUnknownBase<T>::QueryInterface' : function does not take 1 arguments

Intellisenseの警告(役に立つかも?)

18  IntelliSense: function "Microsoft::WRL::Details::RemoveIUnknownBase<T>::QueryInterface [with T=ID3D11Device]" (declared at line 64 of "C:\Program Files (x86)\Windows Kits\8.1\Include\winrt\wrl/client.h") is inaccessible

解決方法は?

を使用する場合 ComPtr を使用する必要があります。 ::As メソッドの代わりに QueryInterface . 例えば hr = device.As(&device1);