在 C++/WinRT 组件中对 COM-lite 对象使用智能指针有什么建议吗?
Any recommendation in using smart pointers for COM-lite objects in C++/WinRT component?
C++/WinRT 提供 3 种智能指针用于 COM 对象 - Microsoft::WRL::ComPtr
、com_ptr
和基于 ATL 的 CComPtr
.
在我的例子中,它是一个 COM-lite 对象,这意味着它不是进程内或进程外的 COM 对象,它是作为 C++ 对象创建的。
在那种情况下,我应该在 C++/WinRT 组件中使用哪个智能指针?
无论是使用“真正的 COM”还是“COM lite”(a.k.a.“nano-COM”),您都可以使用 IUnknown
方法以相同的方式跟踪生命周期 AddRef 和 Release。各种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,社区版没有这个问题。
C++/WinRT 提供 3 种智能指针用于 COM 对象 - Microsoft::WRL::ComPtr
、com_ptr
和基于 ATL 的 CComPtr
.
在我的例子中,它是一个 COM-lite 对象,这意味着它不是进程内或进程外的 COM 对象,它是作为 C++ 对象创建的。
在那种情况下,我应该在 C++/WinRT 组件中使用哪个智能指针?
无论是使用“真正的 COM”还是“COM lite”(a.k.a.“nano-COM”),您都可以使用 IUnknown
方法以相同的方式跟踪生命周期 AddRef 和 Release。各种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,社区版没有这个问题。