首页 文章

C -WinRT的com_ptr重置?

提问于
浏览
0

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

我目前仍然坚持如何在交换链上使用 ResizeBuffers . 我一直收到错误,说我没有释放所有的缓冲区引用 . 如果我评论任何与调整大小缓冲区和只是大小硬编码有关的事情,该应用程序的工作原理 . 所以...我可能做错了什么 .

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

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

  • DeviceResources类现在是一个C / WinRT类,我使用nullptr_t参数默认在所有其他类(SampleScene3DRenderer,DirectXPage和Main)中创建 . 这样,我可以在DirectXPage中创建它,传入swapChainPanel引用,然后将这个DeviceResources实例传递给我创建的所有其他类 .

  • 在DirectX初始化中有一个位置需要传入 **IUnknown . C / WinRT的文档提到使用一个名为 winrt::get_unknown 的函数来返回 *IUnknown . 我无法让它为以下 DWriteCreateFactory 方法工作,所以我尝试了这样:

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

我不知道还能做什么 . 只有交换链调整大小不起作用 . 我在PC上做这个(不是Windows手机) .

1 回答

  • 2

    上面使用 winrt::com_ptr<T>put 成员的 DWriteCreateFactory 调用是正确的 . 同样使用 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

相关问题