由于刚刚接触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);这两种方法都可以得到正确的结果,不知道具体的差别?

解决方案 »

  1.   

    1、通过智能指针代理访问;
    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;
    }
      

  2.   

    参考这里,讲得挺清楚的:
    http://topic.csdn.net/u/20080606/10/061cfe75-8a39-4d3a-9bd9-e908694ac060.html
      

  3.   


    1.hr = myDispatch.QueryInterface(&myFun); 2.hr = myDispatch->QueryInterface(IID_IFun,(void **)&myFun); 这两种方法都可以得到正确的结果,不知道具体的差别?第一种方式:调用了CComPtr::QueryInterface
    第二种方式:调用了ComPtr::operator &()
      

  4.   

    你还能这样查询接口:
    CComQIPtr<IFun> myFun = myDispatch;
    CComQIPtr<IFun> myFun(myDispatch);
      

  5.   

    1.hr = myDispatch.QueryInterface(&myFun); 2.hr = myDispatch->QueryInterface(IID_IFun,(void **)&myFun); 第一种方式的QueryInterface函数内部封装了第二种方式的调用。