Использование winrt::com_ptr‹ID3D11Device1› с D3D11CreateDevice()?

Я изучал код из пример проекта DirectXTK. и пытаемся реализовать это в новом проекте. Похоже, Microsoft рекомендует использовать WinRT в новые проекты, поэтому я решил попробовать переключить экземпляры WRL::ComPtr на winrt::com_ptr. Однако я застрял, пытаясь перемещаться между ID3D11Device1 в классе Game проекта и ID3DDevice в D3D11CreateDevice().

Вот пример кода, немного абстрагированный для простоты:

ComPtr<ID3D11Device1> global_device;

void CreateDevice()
{
    ...

    ComPtr<ID3D11Device> local_device;
    ThrowIfFailed(D3D11CreateDevice( ... local_device.ReleaseAndGetAddressOf() ... ));
    ThrowIfFailed(local_device.As(&global_device));
}

И вот мое приближение к WinRT:

com_ptr<ID3D11Device1> global_device;

void createDevice()
{
    ...

    com_ptr<ID3D11Device> local_device;
    check_hresult(D3D11CreateDevice( ... local_device.put() ... ));
    global_device = local_device.as<ID3D11Device1>();
}

Однако каждый раз, когда я запускаю его, я получаю следующие ошибки:

Error   C2664    'HRESULT IUnknown::QueryInterface(const IID &,void **)': cannot convert argument 1 from 'const winrt::guid' to 'const IID &'   HelloDX11   .\x64\Debug\Generated Files\winrt\base.h    1955    
Message      No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called   HelloDX11   .\x64\Debug\Generated Files\winrt\base.h    1955    
Message      Reason: cannot convert from 'const winrt::guid' to 'const IID' HelloDX11   .\x64\Debug\Generated Files\winrt\base.h    1955    
Message      see reference to function template instantiation 'winrt::com_ptr<ID3D11Device1> winrt::com_ptr<ID3D11Device>::as<ID3D11Device1>(void) const' being compiled    HelloDX11   .\game.cpp  47  
Message      see reference to function template instantiation 'winrt::com_ptr<ID3D11Device1> winrt::impl::as<To,ID3D11Device>(From *)' being compiled
        with
        [
            To=ID3D11Device1,
            From=ID3D11Device
        ]   HelloDX11   .\x64\Debug\Generated Files\winrt\base.h    2377    

Я просмотрел документы для WRL::ComPtr.As() здесь, документы для winrt::com_ptr.as() здесь и пример "конверсии" здесь примерно столько раз, сколько я могу выдержать на этом этапе. Что мне не хватает?


person yingpar    schedule 23.06.2019    source источник
comment
Похоже, это корень проблемы: Причина: невозможно преобразовать из «const winrt::guid» в «const IID», но я не могу найти других примеров в Google, что, похоже, указывает на то, что я сделал что-то однозначно тупоголовое здесь.   -  person yingpar    schedule 23.06.2019
comment
Из Новости и изменения в Windows SDK версии 10.0.17763.0 (Windows 10, версия 1809): winrt::guid преобразуется в GUID, если вы включаете unknwn.h перед включением каких-либо заголовков C++/WinRT. Возможно, это применимо здесь.   -  person IInspectable    schedule 23.06.2019
comment
Да, это сделало это. Это также убрало пару странных предупреждений. Всегда читайте примечания к патчу — спасибо!   -  person yingpar    schedule 23.06.2019
comment
Кстати, вы можете смешивать WRL и C++/WinRT в одном проекте. Я использую Microsoft::WRL::ComPtr, потому что он повсеместно используется в Windows 8 SDK. Решение C++/WinRT — это хорошо, но оно недоступно в пакетах SDK по умолчанию до Windows 10 SDK (17134), что также означает, что оно недоступно для VS 2015.   -  person Chuck Walbourn    schedule 24.06.2019


Ответы (1)


Ответ на комментарий IInspectable:

«winrt::guid преобразуется в GUID, если вы включите Unknwn.h перед включением каких-либо заголовков C++/WinRT». См.: https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/news#news-and-changes-in-windows-sdk-version-100177630.-windows-10-версия-1809

person yingpar    schedule 23.06.2019