主要是想重写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;
}
{
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;
}
*ppObj = static_cast<ISearchCompletedCallback*>(this);应该是
if (riid == IID_IUnknown)
*ppObj = static_cast<IUnknown*>(this);
*ppObj = static_cast<IUnknown*>(this);
了。
但是好像还是有问题,还有,我在初始时
m_nRefCount = 0;合适吗?