2016-10-20 15 views
0

私はデスクトップの複製用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と互換性がありますか?

+0

私が正しく理解していれば、DXGIはCOMに基づいています。とにかく、E_NOINTERFACEはCOMエラーです。おそらくあなたは、いずれかのインターフェイスを使用する前にCoInitializeExを呼び出す必要があります。関連する場合としない場合があるhttps://blogs.msdn.microsoft.com/oldnewthing/20041213-00/?p=37043も参照してください。 –

+0

すぐには分かりませんが、なぜあなたはまだ使用しているアダプターを(間接的に)リリースしますか?とにかく、[ID3D12Debug :: EnableDebugLayer](https://msdn.microsoft.com/en-us/library/windows/desktop/dn986877.aspx)。 – IInspectable

+0

私はプログラムの始めにCoInitializeExを呼び出そうとしましたが、無駄です。 – Alex

答えて

1

DXGI DuplicateOutputは、まだDirectX 12デバイスをサポートしていません。 DirectXを使用する経験がないので、DirectX 11を使用する必要があります。 DirectXの12はすでにD3D11On12CreateDeviceデバイスがDXGI DuplicateOutputで動作する必要があることを注意のDirectX 11

に深く精通していると想定されているグラフィックスの専門家のために設計されたAPIですが、私はそれを自分自身を試していませんでした。

関連する問題