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

Any recommendation in using smart pointers for COM-lite objects in C++/WinRT component?

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

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

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

无论是使用“真正的 COM”还是“COM lite”(a.k.a.“nano-COM”),您都可以使用 IUnknown 方法以相同的方式跟踪生命周期 AddRefRelease。各种COMsmart-pointers都依赖IUnknown方法,你想用哪个就用哪个。

对于 C++/WinRT 应用程序,建议使用 winrt::com_ptr。有关详细信息,请参阅 Microsoft 文档中的 Consume COM components with C++/WinRT

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

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

  • WRL ComPtr 也适用于旧版本 Windows 上的 Win32 classic 桌面应用程序。您可以使用 #include <wrl/client.h> 来获得这个 class,如果您根本不使用 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 Magazine Article.

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

Microsoft Docs