【问题标题】:How to consume ISwapChainPanelNative interface from SwapChainPanel IntPtr如何从 SwapChainPanel IntPtr 使用 ISwapChainPanelNative 接口
【发布时间】:2020-11-28 10:58:39
【问题描述】:

我正在从 C# 代码创建 Microsoft.UI.Xaml.Controls.SwapChainPanel 实例并像这样获取它的 IntPtr:

    WinRT.IObjectReference nativeObject = ((IWinRTObject)MySwapChainPanel).NativeObject;
    IntPtr panelIntPtr = nativeObject.ThisPtr;

    var cli = new MyCliClass();
    cli.SetRenderer(panelIntPtr);

在 C++/CLI 项目中,我尝试像这样使用它:

#include <d3d11_2.h>
#include <d2d1_2.h>
#include <windows.ui.xaml.media.dxinterop.h>

void TestPlayerCli::MyCliClass::SetRenderer(System::IntPtr swapChainPtr)
{
    ISwapChainPanelNative* panelNative;
    reinterpret_cast<IUnknown*>(swapChainPtr.ToPointer())->QueryInterface(IID_PPV_ARGS(&panelNative));
    //not working either
    //panelNative = (ISwapChainPanelNative*)swapChainPtr.ToPointer();

    IDXGISwapChain2* m_swapChain;
    //init m_swapChain code...
    HRESULT hr = panelNative->SetSwapChain(m_swapChain);
}

在这种情况下,从提供的 swapChainPtr 获取 ISwapChainPanelNative 对象的正确方法是什么?

【问题讨论】:

    标签: c++-cx


    【解决方案1】:

    对于 WinUI3,您需要#include microsoft.ui.xaml.media.dxinterop.h> 而不是 windows.ui.xaml.media.dxinterop。 h>.

    【讨论】:

    • 只是澄清一下,如果其他人需要的话。我从 WinUI3 (preview 3 atm) 模板创建了 C++/WinRT 组件项目并包含 #include
    • 感谢您的回答,它有效。但我想知道,为什么你将新的 IID 63aad0b8-7c24-40ff-85a8-640d944cc325 分配给完全相同且二进制兼容的 COM 接口,它已经在另一个标头中分配了 f92f19d2-3ade-45a6-a20c-f6f1ea90554b ?你这样做破坏了不止一个第三方库。
    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 2011-07-26
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多