由于刚刚接触COM,对智能指针还不太了解,定义一个智能指针如下:CComPtr <IDispatch> myDispatch;
CComPtr <IFun> myFun;
hr = myDispatch.CoCreateInstance(CLSID_Fun);
下面查询接口有两种,不知道有什么不同1.hr = myDispatch.QueryInterface(&myFun);2.hr = myDispatch->QueryInterface(IID_IFun,(void **)&myFun);这两种方法都可以得到正确的结果,不知道具体的差别?
CComPtr <IFun> myFun;
hr = myDispatch.CoCreateInstance(CLSID_Fun);
下面查询接口有两种,不知道有什么不同1.hr = myDispatch.QueryInterface(&myFun);2.hr = myDispatch->QueryInterface(IID_IFun,(void **)&myFun);这两种方法都可以得到正确的结果,不知道具体的差别?
2、直接通过被智能指针包装的对象访问。 在未初始化之前,第一种会在智能指针层次进行安全检验,而第二种会报错或引起程序崩溃。
智能指针大概如下包装:
template<class T>
class CComPtr
{
public:
....
HRESULT QueryInterface(...)
{
if( m_ptr ) return m_ptr->QueryInterface(...);
} T* operator->() const
{
return m_ptr;
}protected:
T* m_ptr;
}
http://topic.csdn.net/u/20080606/10/061cfe75-8a39-4d3a-9bd9-e908694ac060.html
1.hr = myDispatch.QueryInterface(&myFun); 2.hr = myDispatch->QueryInterface(IID_IFun,(void **)&myFun); 这两种方法都可以得到正确的结果,不知道具体的差别?第一种方式:调用了CComPtr::QueryInterface
第二种方式:调用了ComPtr::operator &()
CComQIPtr<IFun> myFun = myDispatch;
CComQIPtr<IFun> myFun(myDispatch);