【问题标题】:ComPtr vs CComPtr, As vs QueryInterfaceComPtr 与 CComPtr,As 与 QueryInterface
【发布时间】:2020-06-18 23:57:31
【问题描述】:

我只想知道ComPtrCComPtr 之间的确切区别,以及ComPtr::As() 是否类似于CComPtr::QueryInterface()? 我阅读了两者的文档,但这个问题没有明确的答案......

【问题讨论】:

    标签: c++ atl wrl


    【解决方案1】:

    ComPtr 和 CComPtr 之间的确切区别

    它们只是来自不同框架的 COM 接口智能包装器。 ComPtr 是 Windows 运行时 C++ 模板库 (WRL) 的一部分。 CComPtr 是活动模板库 (ATL) 的一部分。它们为各自的框架服务于类似的目的 - 提供自动引用计数和 refcount-safe 类型转换。但是您不应该将它们互换使用。如果您正在编写 WRL 代码,请使用 ComPtr。如果您正在编写 ATL 代码,请使用 CComPtr

    ComPtr::As() 是否类似于 CComPtr::QueryInterface()?

    是的,因为As() 只是在内部调用QueryInterface()

    【讨论】:

      【解决方案2】:

      这些类的好处是你有源代码,在C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\winrt\wrl\client.h(适应你的上下文和 Visual Studio 版本):

      template <typename T>
      class ComPtr
      {
      public:
          typedef T InterfaceType;
      
          ...
      
          // query for U interface
          template<typename U>
          HRESULT As(_Inout_ Details::ComPtrRef<ComPtr<U>> p) const throw()
          {
              return ptr_->QueryInterface(__uuidof(U), p);
          }
      
          // query for U interface
          template<typename U>
          HRESULT As(_Out_ ComPtr<U>* p) const throw()
          {
              return ptr_->QueryInterface(__uuidof(U), reinterpret_cast<void**>(p->ReleaseAndGetAddressOf()));
          }
      
          // query for riid interface and return as IUnknown
          HRESULT AsIID(REFIID riid, _Out_ ComPtr<IUnknown>* p) const throw()
          {
              return ptr_->QueryInterface(riid, reinterpret_cast<void**>(p->ReleaseAndGetAddressOf()));
          }
      
          ...
      };
      

      所以,是的,As 基本上在下面调用QueryInterface

      【讨论】:

        猜你喜欢
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        • 2015-05-09
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        相关资源
        最近更新 更多