将 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 示例广泛使用 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
目标是 "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
的等价物来释放任何现有指针以避免潜在的内存泄漏。
没有 Get
、GetAddressOf
或 ReleaseAndGetAddressOf
方法,因为 CComPtr
使用旧式自动转换为原始指针problematic
没有Reset
清除CComPtr
的方法所以必须设置为NULL
.
没有As
方法所以你必须使用更罗嗦的QueryInterface
解决方案。
您可能可以通过派生一个添加了缺失方法的辅助版本来解决其中的大部分问题,但这需要一些工作...
struct MyComPtr : public ATL::CComPtr
我正在努力创建 WPF 资产(如 D3D11Image), from a DirectX12 Win32 desktop sample : 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
目标是 "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
的等价物来释放任何现有指针以避免潜在的内存泄漏。没有
Get
、GetAddressOf
或ReleaseAndGetAddressOf
方法,因为CComPtr
使用旧式自动转换为原始指针problematic没有
Reset
清除CComPtr
的方法所以必须设置为NULL
.没有
As
方法所以你必须使用更罗嗦的QueryInterface
解决方案。
您可能可以通过派生一个添加了缺失方法的辅助版本来解决其中的大部分问题,但这需要一些工作...
struct MyComPtr : public ATL::CComPtr