Реализовать функции 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; };