2

デスクトップ複製 API を利用するアプリケーションを作成しようとしてきましたが、directx の経験がないため、非常に難しいことがわかりました。output1->DuplicateOutput()E_NOINTERFACEを返す時点で呼び出すまで、すべてが機能しているようです。このエラーは msdn ドキュメントで定義されていないため、問題の診断に苦労しています。このコードは機能すると思いますが、何か不足しているに違いありません。

#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;
}

デバッグ ウィンドウで、 を呼び出したときに 2 つの _com_errors が発生していることに気付きましたoutput1->DuplicateOutput

アップデート:

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 に対応していませんか?

4

1 に答える 1