对于在 C++/WinRT 组件中使用 COM-lite 对象的智能指针有什么建议吗?

Sne*_*han 9 c++ winrt-component c++-winrt cppwinrt

C++/WinRT 提供了 3 种用于 COM 对象的智能指针 -Microsoft::WRL::ComPtr基于com_ptr、 和 ATL 的智能指针CComPtr

就我而言,它是一个 COM-lite 对象,这意味着它不是进程内或进程外 COM 对象,它是作为 C++ 对象创建的。

在这种情况下,我应该在 C++/WinRT 组件中使用哪个智能指针?

Chu*_*urn 11

无论使用“true COM”还是“COM lite”(又名“nano-COM”),您都可以使用AddRefReleaseIUnknown方法以相同的方式跟踪生命周期。各种 COM 智能指针都依赖于这些方法,因此您可以选择您想要的任何一种。IUnknown

对于 C++/WinRT 应用程序,建议使用winrt::com_ptr. 有关详细信息,请参阅Microsoft Docs 上的通过 C++/WinRT 使用 COM 组件

我个人更喜欢在所有代码中使用Microsoft::WRL::ComPtr,因为我的项目通常支持使用 C++/CX 的 UWP、使用 C++/WinRT 的 UWP、通过 C++/CX 使用 XDK 的 Xbox、通过 C++/WinRT 使用 XDK 的 Xbox ,Xbox使用GDK,以及Win32桌面平台。

  • WRL ComPtr 适用于使用 C++/CX 或 C++/WinRT 的 Windows 运行时应用程序。

  • WRL ComPtr 也适用于旧版本 Windows 上的 Win32 经典桌面应用程序。您可以使用#include <wrl/client.h>来获取此类,如果您完全不使用 Windows 运行时 API,您也可以同时定义两者__WRL_NO_DEFAULT_LIB____WRL_CLASSIC_COM_STRICT__预处理器定义。

  • WRL 随 Windows 8.0 SDK、Windows 8.1 SDK、Windows 10 SDK 和 Xbox One XDK 一起提供。这意味着它可以一直追溯到 Visual Studio 2012。

  • 这是比旧的 ATL 更好的选择CComPtr。WRL 本质上是“ATL 2.0”,因此许多微妙的使用问题已得到修复。请参阅这篇MSDN 杂志文章

  • 关于 ATL 的可用位置也存在一些奇怪的情况。在 Visual Studio“Express”版本中,不包含 ATL/MFC,因为它们被视为“专业”功能。Express SKU 的 VS 2012 和 VS 2013 版本均具有 Windows 8.x SDK,因此它们包含 WRL 但不包含 ATL。FWIW,社区版本没有这个问题。

请参阅微软文档