5

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

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

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

4

1 回答 1

6

无论是使用“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,社区版没有这个问题。

请参阅Microsoft 文档

于 2020-09-02T19:18:25.017 回答