C++/WinRT 提供了 3 种类型的智能指针用于 COM 对象 - Microsoft::WRL::ComPtr
、com_ptr
和基于 ATL 的CComPtr
.
在我的例子中,它是一个 COM-lite 对象,这意味着它不是进程内或进程外 COM 对象,它是作为 C++ 对象创建的。
在这种情况下,我应该在 C++/WinRT 组件中使用哪个智能指针?
C++/WinRT 提供了 3 种类型的智能指针用于 COM 对象 - Microsoft::WRL::ComPtr
、com_ptr
和基于 ATL 的CComPtr
.
在我的例子中,它是一个 COM-lite 对象,这意味着它不是进程内或进程外 COM 对象,它是作为 C++ 对象创建的。
在这种情况下,我应该在 C++/WinRT 组件中使用哪个智能指针?
无论是使用“true COM”还是“COM lite”(又名“nano-COM”),您都可以使用AddRef和ReleaseIUnknown
方法以相同的方式跟踪生命周期。各种 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 文档