Как реализовать взаимодействие между XAML и цепочкой подкачки DirectX с помощью C / WinRT

#xaml #c -winrt #directx-12

#xaml #c -winrt #directx-12

Вопрос:

Документация Microsoft предоставляет код для реализации взаимодействия между XAML и цепочкой подкачки DirectX с помощью C [1]:

 Microsoft::WRL::ComPtr<ISwapChainPanelNative>   m_swapChainNative;
// ...
IInspectable* panelInspectable = (IInspectable*) reinterpret_cast<IInspectable*>(swapChainPanel);
panelInspectable->QueryInterface(__uuidof(ISwapChainPanelNative), (void **)amp;m_swapChainNative);
  

Однако я не смог выяснить, как я должен реализовать это с помощью C / WinRT.

При использовании этого кода я получаю следующее сообщение об ошибке :

» […] ‘reinterpret_cast’: не удается преобразовать из ‘winrt:: Windows::UI::Xaml::Controls::SwapChainPanel’ в ‘IInspectable *’ »

Я использую DirectX12, Visual Studio 2017.

[1] https://learn.microsoft.com/en-us/windows/desktop/api/windows.ui.xaml.media.dxinterop/nn-windows-ui-xaml-media-dxinterop-iswapchainpanelnative

Комментарии:

1. Что касается остальной части моего кода, я начал с одной стороны с пустого шаблона для приложения C / WinRT, и я полностью взял конвейер рендеринга из [2]. У меня нет другой проблемы со сборкой, кроме кода, который должен связывать XAML и DirectX. [2]: github.com/Microsoft/Xbox-ATG-Samples/tree/master/UWPSamples /…

Ответ №1:

Я не уверен, почему используется эта документация WRL reinterpret_cast . C / WinRT делает это довольно простым:

 winrt::com_ptr<ISwapChainswapChainNative> m_swapChainNative;
// ...
swapChainNative = swapChainPanel.as<ISwapChainPanelNative>();
  

Комментарии:

1. Привет, Райан, спасибо; У меня все еще есть проблемы. По-видимому, чтобы увидеть исходный интерфейс Iswapchainswapchain, ему необходимо «#include <windows.ui.xaml.media.dxinterop.h>», как рассмотрено в [3], найдено после поиска в Google вашего кода. Затем я получаю эту ошибку: «двоичный файл ‘=’: оператор не найден, который принимает правый операнд типа ‘winrt::com_ptr<T>’ «, ссылаясь на «swapChainNative = swapChainPanel.as <ISwapChainPanelNative>();» ; У меня SwapChainPanel определена как: SwapChainPanel SwapChainPanel. [3]: < github.com/Microsoft/cppwinrt/issues/67 >

2. Я буквально только что успешно скомпилировал это с версией cppwinrt 17763 SDK для cppwinrt: « #включить <windows.ui.xaml.media.dxinterop.h> #включить <winrt /Windows.UI.Xaml.Controls.h> #комментарий pragma (библиотека, «WindowsApp.lib») с использованием пространства имен winrt; int main() { winrt:: Windows::UI::Xaml::Controls:: SwapChainPanel SwapChainPanel{ nullptr }; // … winrt::com_ptr<ISwapChainPanelNative> m_swapChainNative; m_swapChainNative = swapChainPanel.as <ISwapChainPanelNative>(); } «

3. Большое спасибо, Райан, включив упомянутые файлы, я вижу, что связанный с взаимодействием код собран правильно. Добавление «m_swapChainNative-> SetSwapChain(цепочка обмена);» также заставляет все работать.