如何解决WinRT组件中的COM-lite对象应使用哪个版本的智能指针?
C ++ / WinRT提供了3种用于COM对象的智能指针-Microsoft::WRL::ComPtr
,com_ptr
和基于ATL的CComPtr
。
在我的情况下,它是一个COM精简对象,这意味着它不是进程内或进程外COM对象,而是作为C ++对象创建的。
在那种情况下,我应该在C ++ / WinRT组件中使用哪个智能指针?
解决方法
无论使用“ true COM”还是“ COM lite”(又名“ nano-COM”),您都可以使用IUnknown
方法 AddRef 和释放。各种COM智能指针都依赖于IUnknown
方法,因此您可以随便哪个。
对于C ++ / WinRT应用程序,建议使用winrt::com_ptr
。有关更多信息,请参阅Microsoft文档上的Consume COM components with C++/WinRT。
我个人更喜欢在我的所有代码中使用 Microsoft :: WRL :: ComPtr ,因为我的项目通常支持使用C ++ / CX的UWP,使用C ++ / WinRT的UWP,使用XDK以及通过C ++ /的Xbox。 CX,通过C ++ / WinRT使用XDK的Xbox,使用GDK的Xbox和Win32桌面平台。
-
WRL ComPtr适用于使用C ++ / CX或C ++ / WinRT的Windows运行时应用程序。
-
WRL ComPtr也适用于旧版Windows上的Win32经典桌面应用程序。您可以使用
#include <wrl/client.h>
来获得此类,并且如果您不使用所有Windows Runtime 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,因为它们被视为“专业”功能。 VS 2012和VS 2013版本的Express SKU都具有Windows 8.x SDK,因此它们包括WRL但不包括ATL。 FWIW,社区版本没有此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。