C ++ - WinRT сбросил com_ptr? - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь перенести шаблон DirectX11 / XAML UWP на версию C ++ - WinRT ... где ВСЕ выполняется через C ++ - WinRT, и я могу отключить CX.

В настоящее время я застрял на том, как ResizeBuffers на swapchain.Я продолжаю получать ошибку, которая говорит, что я не выпустил все ссылки на буфер.Если я закомментирую что-либо, связанное с изменением размера буферов и просто жестким кодом в размере, приложение работает.Итак ... Я, вероятно, делаю что-то не так.

Я считаю, что это связано с новым winrt::com_ptr.Нет метода Reset, как на WRL ComPtr.Я установил для них значение nullptr, как в исходных шаблонах C ++ / CX, но этого, похоже, недостаточно.

Другие вещи, которые мне приходилось делать, могут влиять на происходящееon:

  1. Класс DeviceResources теперь является классом C ++ / WinRT, который я создаю по умолчанию во всех других классах (SampleScene3DRenderer, DirectXPage и & Main) с помощью параметра nullptr_t.Таким образом, я могу создать его в DirectXPage, передать ссылку swapChainPanel, а затем передать этот один экземпляр DeviceResources всем другим классам, которые я создаю.

  2. В DirectX есть одно местоинициализация, где вы должны пройти в **IUnknown.Документы для C ++ / WinRT упоминают об использовании функции с именем winrt::get_unknown для возврата *IUnknown.Я не смог заставить его работать для следующего DWriteCreateFactory метода, поэтому я попробовал его следующим образом:

     DX::ThrowIfFailed(
        DWriteCreateFactory(
           DWRITE_FACTORY_TYPE_SHARED,
           __uuidof(IDWriteFactory3),
           reinterpret_cast<::IUnknown**>(m_dwriteFactory.put())
        )
    );
    

Я не уверен, что еще делать.Только изменение размера swapchain не работает.Я делаю это на ПК (не Windows Phone).

1 Ответ

0 голосов
/ 11 июня 2018

Вызов DWriteCreateFactory с использованием winrt::com_ptr<T> и вышеприведенного члена put является правильным.Также использование nullptr присваивания является правильным способом сброса com_ptr<T>.

com_ptr<IUnknown> ptr = ...

assert(ptr);
ptr = nullptr;
assert(!ptr);

. Вы также можете использовать winrt::check_hresult вместо ThrowIfFailed, если хотите быть в соответствии с тем, как C ++ / WinRT сообщаетошибки.Вот простой пример DirectX, полностью написанный на C ++ / WinRT:

https://github.com/kennykerr/cppwinrt/blob/master/Store/Direct2D/App.cpp

...