1

我正在从 DirectX12 Win32 桌面示例创建 WPF 资产(如D3D11Image):D3D12PipelineStateCache,因此我可以将其作为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

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

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

目标是“通过停止来自 win32 的代码来分离停止”并使其与 XAML 资产接口。

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

4

1 回答 1

1

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

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

  • 请记住,operator&在较旧的 ATLCComPtr中,在执行等效于GetAddressOf. 在ComPtr使用operator&显式调用等价ReleaseAndGetAddressOf于释放任何现有指针以避免潜在的内存泄漏。

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

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

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

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

struct MyComPtr : public ATL::CComPtr
于 2018-04-20T17:49:53.690 回答