Я изучал код из пример проекта 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()
здесь и пример "конверсии" здесь примерно столько раз, сколько я могу выдержать на этом этапе. Что мне не хватает?
winrt::guid
преобразуется в GUID, если вы включаете unknwn.h перед включением каких-либо заголовков C++/WinRT. Возможно, это применимо здесь. - person IInspectable   schedule 23.06.2019Microsoft::WRL::ComPtr
, потому что он повсеместно используется в Windows 8 SDK. Решение C++/WinRT — это хорошо, но оно недоступно в пакетах SDK по умолчанию до Windows 10 SDK (17134), что также означает, что оно недоступно для VS 2015. - person Chuck Walbourn   schedule 24.06.2019