7

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

4

2 回答 2

5

ComPtr 和 CComPtr 之间的确切区别

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

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

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

于 2020-03-06T17:57:58.420 回答
3

这些类的好处是你有源代码,在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

于 2020-03-06T09:25:07.743 回答