将 Directx12 资产移植到 XAML 元素中:关于 WRL::ComPtr 替换的建议?

Porting Directx12 Asset into XAML element: advice on WRL::ComPtr replacement?

我正在努力创建 WPF 资产(如 D3D11Image), from a DirectX12 Win32 desktop sample : D3D12PipelineStateCache,因此我可以将其作为 XAML 元素嵌入 WPF 应用程序

Microsoft Directx12 示例广泛使用 ComPtrusing Microsoft::WRL::ComPtr;#include <wrl.h>)智能指针,但构建失败,因为:

// Don't allow to compile sources with /clr
#ifdef _MANAGED
#error WRL cannot be compiled with /clr option enabled
#endif

Repro:我开始更改D3D12PipelineStateCache项目中的配置属性:

目标是 "detach stop by stop the code from win32" 并使其与 XAML 资产接口。

您是否有智能指针替代 ComPtr 的任何建议,或者您是否建议以不同的方式进行,例如,通过与 clr dll 互操作构建纯 c++ dll,在这种情况下,如何?

WRL 通常假定您将使用明确设计为与 C# 和 C++ 互操作的 Windows 运行时,因此托管 C++ (/clr)) 方案被排除在外。

您应该可以使用 ATL 的 CComPtr,而不是包含 <atlbase.h>,但这需要一些代码更改才能工作。

  • 请记住,旧版 ATL CComPtr 中的 operator& 断言指针在执行 GetAddressOf 的等效操作之前始终为空。在 ComPtr 中,使用 operator& 显式调用 ReleaseAndGetAddressOf 的等价物来释放任何现有指针以避免潜在的内存泄漏。

  • 没有 GetGetAddressOfReleaseAndGetAddressOf 方法,因为 CComPtr 使用旧式自动转换为原始指针problematic

  • 没有Reset清除CComPtr的方法所以必须设置为NULL.

  • 没有As方法所以你必须使用更罗嗦的QueryInterface解决方案。

您可能可以通过派生一个添加了缺失方法的辅助版本来解决其中的大部分问题,但这需要一些工作...

struct MyComPtr : public ATL::CComPtr