C ++ - WinRT的com_ptr重置?

时间:2018-06-10 22:54:48

标签: directx-11 c++-winrt

我正在尝试将DirectX11 / XAML UWP模板移植到C ++ - WinRT版本......其中一切都是通过C ++完成的 - WinRT我可以关闭CX。

我目前仍然坚持如何在交换链上ResizeBuffers。我一直收到错误消息说我还没有释放所有的缓冲区引用。如果我注释掉任何与调整大小缓冲区有关的内容,只是在大小上进行硬编码,那么该应用程序可以运行。所以......我可能做错了什么。

我认为这与新的winrt::com_ptr有关。 WRL ComPtr上没有Reset方法。我将它们设置为nullptr就像在原始的C ++ / CX模板中一样,但这似乎还不够。

我必须做的其他事情可能会对正在发生的事情产生影响:

  1. DeviceResources类现在是一个C ++ / WinRT类,我默认使用nullptr_t参数在所有其他类(SampleScene3DRenderer,DirectXPage和& Main)中创建。这样,我可以在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())
        )
    );
    
  3. 我不知道还能做什么。只有交换链调整大小不起作用。我在PC上做这个(不是Windows手机)。

1 个答案:

答案 0 :(得分:3)

使用上述DWriteCreateFactorywinrt::com_ptr<T>成员的put来电是正确的。使用nullptr分配也是重置com_ptr<T>的正确方法。

com_ptr<IUnknown> ptr = ...

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

如果您希望与C ++ / WinRT报告错误的方式保持一致,您也可以使用winrt::check_hresult而不是ThrowIfFailed。这是一个完全用C ++ / WinRT编写的简单DirectX示例:

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