主要是想重写ISearchCompletedCallback接口中的Invoke(回调)方法。但是又要实现这个继承纯虚接口的类就只能将这三个方法也重写,但是在调试过程中发现总是有问题,计数器在不知不觉地就增加了很多,到最后释放总是出现问题。class CSearchCpCallback : public ISearchCompletedCallback
{
public:
    CSearchCpCallback();
    ~CSearchCpCallback();
    HRESULT STDMETHODCALLTYPE QueryInterface(
        REFIID riid , 
        void **ppObj);
    ULONG STDMETHODCALLTYPE AddRef();
    ULONG STDMETHODCALLTYPE Release();
    HRESULT __stdcall Invoke(
        ISearchJob* searchJob,
        ISearchCompletedCallbackArgs* callbackArgs);
    
protected:
private:
//     long m_nX1 , m_nX2; //operands for addition
    long m_nRefCount;   //for managing the reference count
};
CSearchCpCallback::CSearchCpCallback()
{
   m_nRefCount = 0;
}
HRESULT __stdcall CSearchCpCallback::QueryInterface(
                                    REFIID riid , 
                                    void **ppObj)
{
//  *ppObj=this;
//  return S_OK;
    if (riid == IID_IUnknown)
        *ppObj = static_cast<ISearchCompletedCallback*>(this);
    else if (riid == IID_ISearchCompletedCallback)
        *ppObj = static_cast<ISearchCompletedCallback*>(this);
    else
        return (*ppObj = 0), E_NOINTERFACE;
    reinterpret_cast<IUnknown*>(*ppObj)->AddRef();
    return S_OK;
}//QueryInterface methodULONG   __stdcall CSearchCpCallback::AddRef()
{
    return InterlockedIncrement(&m_nRefCount) ;
}ULONG   __stdcall CSearchCpCallback::Release()
{     
    long nRefCount=0;
    nRefCount=InterlockedDecrement(&m_nRefCount) ;
    if (nRefCount == 0) delete this;
    return nRefCount;
}

解决方案 »

  1.   

    if (riid == IID_IUnknown)
    *ppObj = static_cast<ISearchCompletedCallback*>(this);应该是
    if (riid == IID_IUnknown)
    *ppObj = static_cast<IUnknown*>(this);
      

  2.   

    那请问如果查询的接口是IID_IUnknown的话,还需要调用AddRef()吗?
      

  3.   

    应该要的,这是COM的约定。QueryInterface返回的接口一般需要release。如果不addref,release就会出错
      

  4.   

    改为 if (riid == IID_IUnknown)
    *ppObj = static_cast<IUnknown*>(this);
    了。
    但是好像还是有问题,还有,我在初始时
    m_nRefCount = 0;合适吗?