CComPtr<IWebBrowser2> m_spWebBrowser;STDMETHODIMP CRayBHO::SetSite(IUnknown*pUnkSite)
{
if(pUnkSite!=NULL)
{
pUnkSite->QueryInterface(IID_IWebBrowser2,(void**)&m_spWebBrowser);
}
else
{
m_spWebBrowser.Release();
}
return IObjectWithSiteImpl::SetSite(pUnkSite);
}上面的那个release需要吗上面是否可以改成
if(pUnkSite!=NULL)
{
m_spWebBrowser = pUnkSite;
}
else
{
m_spWebBrowser.Release();
}

解决方案 »

  1.   

    这个问题要先看CComPtr的定义:template <class T>
    class CComPtr
    {
    public:
    typedef T _PtrClass;
    CComPtr()
    {
    p=NULL;
    }
    CComPtr(T* lp)
    {
    if ((p = lp) != NULL)
    p->AddRef();
    }
    CComPtr(const CComPtr<T>& lp)
    {
    if ((p = lp.p) != NULL)
    p->AddRef();
    }
    ~CComPtr()
    {
    if (p)
    p->Release();
    }
    void Release()
    {
    IUnknown* pTemp = p;
    if (pTemp)
    {
    p = NULL;
    pTemp->Release();
    }
    }

            //..... 省略掉无关代码 T* operator=(T* lp)
    {
    return (T*)AtlComPtrAssign((IUnknown**)&p, lp);
    }
    T* operator=(const CComPtr<T>& lp)
    {
    return (T*)AtlComPtrAssign((IUnknown**)&p, lp.p);
    }        //..... 省略掉无关代码 T* p;
    };ATLINLINE ATLAPI_(IUnknown*) AtlComPtrAssign(IUnknown** pp, IUnknown* lp)
    {
    if (lp != NULL)
    lp->AddRef();
    if (*pp)
    (*pp)->Release();
    *pp = lp;
    return lp;
    }所以,要不要显示的调release要看你的需求,m_spWebBrowser析构时会自动调release。至于m_spWebBrowser = pUnkSite;应该是可行的,只要你确保传进去的pUnkSite是IWebBrowser2*类型的(IWebBrowser2是从IUnknown过来的,所以IWebBrowser2指针和该对象的IUnknown指针相同)。
      

  2.   

    不需要调,这是智能指针
    如果是COM类里面的,可以在finalrelease里面调用
      

  3.   

    CComPtr 超出作用域应该可以自动释放内存的。