私はデスクトップの複製用APIを利用するアプリケーションを作成しようとしていましたが、directxの経験がなくても非常に難題になりました。私はoutput1->DuplicateOutput()
と呼ぶまでE_NOINTERFACEを返します。このエラーはmsdnのマニュアルでは定義されていないため、問題の診断に問題があります。私はこのコードがうまくいくはずだと思うが、私は何かが欠けているに違いない。私のデバッグウィンドウでD3D12DeviceでDuplicateOutputを呼び出すときにE_NOINTERFACEで失敗する
#include <windows.h>
#include <d3d12.h>
#include <dxgi1_5.h>
int main()
{
HRESULT hr;
ID3D12Debug *debug;
hr = D3D12GetDebugInterface(IID_PPV_ARGS(&debug));
debug->EnableDebugLayer();
IDXGIFactory1 *factory;
hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory));
IDXGIAdapter1 *adapter;
hr = factory->EnumAdapters1(0, &adapter);
factory->Release();
IDXGIOutput *junkput;
hr = adapter->EnumOutputs(0, &junkput);
IDXGIOutput1 *output1;
hr = junkput->QueryInterface(IID_PPV_ARGS(&output1));
junkput->Release();
ID3D12Device *device;
hr = D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device));
IDXGIOutputDuplication *dupl;
hr = output1->DuplicateOutput(device, &dupl);
return 0;
}
私はoutput1->DuplicateOutput
を呼び出すときに、私は2 _com_errorsを取得していますことに注意してください。
更新:
私が代わりにID3D11DeviceのID3D12Deviceを使用していたという事実にまで問題を縮小しました。このコードが動作するという事実の例として、
ID3D11Device *device;
D3D_FEATURE_LEVEL reallevel;
ID3D11DeviceContext *context;
hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, NULL, featurelevels, ARRAYSIZE(featurelevels), D3D11_SDK_VERSION, &device, &reallevel, &context);
IDXGIOutputDuplication *dupl;
hr = output1->DuplicateOutput(device, &dupl);
私が理解していないのは、それが問題である理由です。デスクトップの複製APIはdirectx 12と互換性がありますか?
私が正しく理解していれば、DXGIはCOMに基づいています。とにかく、E_NOINTERFACEはCOMエラーです。おそらくあなたは、いずれかのインターフェイスを使用する前にCoInitializeExを呼び出す必要があります。関連する場合としない場合があるhttps://blogs.msdn.microsoft.com/oldnewthing/20041213-00/?p=37043も参照してください。 –
すぐには分かりませんが、なぜあなたはまだ使用しているアダプターを(間接的に)リリースしますか?とにかく、[ID3D12Debug :: EnableDebugLayer](https://msdn.microsoft.com/en-us/library/windows/desktop/dn986877.aspx)。 – IInspectable
私はプログラムの始めにCoInitializeExを呼び出そうとしましたが、無駄です。 – Alex