ComPtr 与 CComPtr,As 与 QueryInterface
ComPtr vs CComPtr, As vs QueryInterface
我只想知道ComPtr
和CComPtr
到底有什么区别,ComPtr::As()
是不是CComPtr::QueryInterface()
的类比?
我阅读了两者的文档,但没有明确回答这个问题...
那些 class 的好处是你有源代码,在 C:\Program Files (x86)\Windows Kits\Include.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
。
what exact difference between ComPtr and CComPtr
它们只是来自不同框架的 COM 接口智能包装器。 ComPtr
是 Windows 运行时 C++ 模板库 (WRL) 的一部分。 CComPtr
是活动模板库 (ATL) 的一部分。它们为各自的框架提供相似的目的——提供自动引用计数和引用计数安全的类型转换。但是您不应该将它们互换使用。如果您正在编写 WRL 代码,请使用 ComPtr
。如果您正在编写 ATL 代码,请使用 CComPtr
。
whether ComPtr::As() is analogue of CComPtr::QueryInterface()?
是的,因为 As()
只是在内部调用 QueryInterface()
。
我只想知道ComPtr
和CComPtr
到底有什么区别,ComPtr::As()
是不是CComPtr::QueryInterface()
的类比?
我阅读了两者的文档,但没有明确回答这个问题...
那些 class 的好处是你有源代码,在 C:\Program Files (x86)\Windows Kits\Include.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
。
what exact difference between ComPtr and CComPtr
它们只是来自不同框架的 COM 接口智能包装器。 ComPtr
是 Windows 运行时 C++ 模板库 (WRL) 的一部分。 CComPtr
是活动模板库 (ATL) 的一部分。它们为各自的框架提供相似的目的——提供自动引用计数和引用计数安全的类型转换。但是您不应该将它们互换使用。如果您正在编写 WRL 代码,请使用 ComPtr
。如果您正在编写 ATL 代码,请使用 CComPtr
。
whether ComPtr::As() is analogue of CComPtr::QueryInterface()?
是的,因为 As()
只是在内部调用 QueryInterface()
。