ComPtr против CComPtr, как против QueryInterface - PullRequest
2 голосов
/ 06 марта 2020

Я просто хочу знать, какая точная разница между ComPtr и CComPtr и является ли ComPtr::As() аналогом CComPtr::QueryInterface()? Я читаю документацию по обоим, но нет четкого ответа на вопрос ...

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Что хорошо в этих классах, так это то, что у вас есть источник в 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 внизу.

1 голос
/ 06 марта 2020

какая точная разница между ComPtr и CComPtr

Это просто интеллектуальные оболочки COM-интерфейса из разных сред. ComPtr является частью Windows Runtime C ++ Library Library (WRL). CComPtr является частью Active Template Library (ATL). Они служат аналогичным целям для своих соответствующих структур - для обеспечения автоматического подсчета ссылок и безопасного преобразования типов по счетам. Но вы не должны смешивать их взаимозаменяемо. Если вы пишете код WRL, используйте ComPtr. Если вы пишете код ATL, используйте CComPtr.

является ли ComPtr :: As () аналогом CComPtr :: QueryInterface ()?

Да, потому что As() просто вызывает QueryInterface() внутри.

...