Шаг 28 - Реализуем функции QueryInterface

Реализовать функции QueryInterface надо в двух классах. В самом классе объекта и классе фабрики классов. Вот реализация для фабрики классов:

STDMETHODIMP CClassFactory::QueryInterface(  REFIID  riid,  void**  ppv  )
{
	*ppv  =  0;
	if  (riid  ==  IID_IUnknown  ||  riid  ==  IID_IClassFactory)
		*ppv  =  this;

	if  (*ppv)
	{
		AddRef();
		return  S_OK;
	}
	return(E_NOINTERFACE);
}

А вот и для самого класса.

STDMETHODIMP  Step::QueryInterface(  REFIID  riid,  void**  ppv  )
{
	*ppv  =  0;
	if  (  riid  ==  IID_IUnknown  )
		*ppv  =  (IStep*)  this;
	else  if  (  riid  ==  IID_Step  )
		*ppv  =  (IStep*)  this;
	if  (  *ppv  )
	{
		AddRef();
		return(  S_OK  );
	}
	return  (E_NOINTERFACE);
}

Как видите ничего страшного не происходит. Возвращается ссылка на класс в зависимости от запроса и увеличивается счетчик ссылок. Метода AddRef и Release для класса мы еще не делали и давайте их сделаем.

STDMETHODIMP_(ULONG)  Step::AddRef()
{
	return  InterlockedIncrement(  &m_lRef  );
}

STDMETHODIMP_(ULONG)  Step::Release()
{
	if  (  InterlockedDecrement(  &m_lRef  )  ==  0  )
	{
		delete  this;
		return  0;
	}
	return  m_lRef;
}

А вот переменную, на которую мы ссылаемся, еще надо завести.

class Step : public IStep  
{
......	
	long m_lRef;
};

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 13.04.2000