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

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

本文关键字:WRL 关于 替换 ComPtr 元素 Directx12 XAML      更新时间:2023-10-16

我正在从 DirectX12 Win32 桌面示例 D3D12PipelineStateCache 创建一个 WPF 资产(如 D3D11Image),因此我可以将其作为XAML 元素嵌入到 WPF 应用程序中

Microsoft Directx12 示例广泛使用ComPtr(using 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

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

  • 配置类型:动态库
  • CLR 支持:/CLR
  • .net 目标:v4.5

目标是"通过停止代码从 win32 分离停止",并使其与 XAML 资产接口。

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

WRL 通常假定你将使用 Windows 运行时,该运行时显式设计为与 C# 和 C++ 互操作,因此排除了托管C++ (/clr)) 方案。

您应该能够通过包含<atlbase.h>来使用 ATL 的CComPtr,但这需要一些代码更改才能工作。

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

  • 没有GetGetAddressOfReleaseAndGetAddressOf的方法,因为CComPtr使用老式的自动转换为原始指针,这是有问题的

  • 没有Reset清除CComPtr的方法,因此您必须将其设置为NULL.

  • 没有As方法,因此您必须使用更冗长的QueryInterface解决方案。

您可以通过派生一个添加缺少的方法的帮助程序版本来解决大多数这些问题,但这需要一些工作......

struct MyComPtr : public ATL::CComPtr