2016-10-20 5 views
0

Я пытаюсь создать приложение, которое использует дублирование рабочего стола api, но без опыта работы с DirectX это становится довольно сложной задачей. Кажется, все работает, пока я не позвоню output1->DuplicateOutput(), после чего он возвращает E_NOINTERFACE. Эта ошибка не определена в документации msdn, поэтому мне не удается диагностировать проблему. Я думаю, что этот код должен работать, но я должен что-то упустить.Вызов DuplicateOutput с ошибкой D3D12Decice с 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; 
} 

В моем окне отладки я заметил, что я получаю два _com_errors, когда я называю output1->DuplicateOutput.

Update:

я сузили проблему вплоть до того, что я использую ID3D12Device вместо ID3D11Device. Как показано на примере того, что этот код работает:

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 является API предназначен для графических экспертов, которые, как предполагается, уже глубоко знакомы с DirectX 11.

Обратите внимание, что D3D11On12CreateDevice устройство должно работать с DXGI DuplicateOutput, но я не пробовал сам.