Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

290 lines
5.7 KiB

//---[ tunk.h ]----------------------------------------------------------------
//
// Template for IUnknown<T>
//
//-----------------------------------------------------------------------------
#pragma once
#ifndef _TUNK_H_
#define _TUNK_H_
template<class T>
class TUnknown : public T
{
public:
TUnknown (REFIID iid) : m_nRef(1), m_iid(iid) {}
virtual ~TUnknown() {}
virtual ULONG __stdcall AddRef()
{ return ++m_nRef; }
virtual ULONG __stdcall Release()
{
int nRef = --m_nRef;
if (!nRef)
delete this;
return nRef;
}
virtual HRESULT __stdcall QueryInterface(REFIID iid, void ** lppv)
{
if ((iid == IID_IUnknown) ||
(iid == m_iid))
{
*lppv = this;
AddRef();
return S_OK;
}
else
{
*lppv = NULL;
return E_NOINTERFACE;
}
}
protected:
int m_nRef;
REFIID m_iid;
};
template<class T1, class T2>
class TUnknown2 : public T1, public T2
{
public:
TUnknown2 (REFIID iid, REFIID iid2) : m_nRef(1), m_iid(iid), m_iid2(iid2) {}
virtual ~TUnknown2() {}
virtual ULONG __stdcall AddRef()
{ return ++m_nRef; }
virtual ULONG __stdcall Release()
{
int nRef = --m_nRef;
if (!nRef)
delete this;
return nRef;
}
virtual HRESULT __stdcall QueryInterface(REFIID iid, void ** lppv)
{
if ((iid == IID_IUnknown) ||
(iid == m_iid))
{
*lppv = (LPUNKNOWN)(T1*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid2)
{
*lppv = (LPUNKNOWN)(T2*)this;
AddRef();
return S_OK;
}
else
{
*lppv = NULL;
return S_FALSE;
}
}
protected:
int m_nRef;
REFIID m_iid;
REFIID m_iid2;
};
template<class T1, class T2, class T3>
class TUnknown3 : public T1, public T2, public T3
{
public:
TUnknown3 (REFIID iid, REFIID iid2, REFIID iid3) : m_nRef(1), m_iid(iid), m_iid2(iid2), m_iid3(iid3) {}
virtual ~TUnknown3() {}
virtual ULONG __stdcall AddRef()
{ return ++m_nRef; }
virtual ULONG __stdcall Release()
{
int nRef = --m_nRef;
if (!nRef)
delete this;
return nRef;
}
virtual HRESULT __stdcall QueryInterface(REFIID iid, void ** lppv)
{
if ((iid == IID_IUnknown) ||
(iid == m_iid))
{
*lppv = (LPUNKNOWN)(T1*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid2)
{
*lppv = (LPUNKNOWN)(T2*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid3)
{
*lppv = (LPUNKNOWN)(T3*)this;
AddRef();
return S_OK;
}
else
{
*lppv = NULL;
return S_FALSE;
}
}
protected:
int m_nRef;
REFIID m_iid;
REFIID m_iid2;
REFIID m_iid3;
};
template<class T1, class T2, class T3, class T4>
class TUnknown4 : public T1, public T2, public T3, public T4
{
public:
TUnknown4 (REFIID iid, REFIID iid2, REFIID iid3, REFIID iid4) :
m_nRef(1), m_iid(iid), m_iid2(iid2), m_iid3(iid3), m_iid4(iid4) {}
virtual ~TUnknown4() {}
virtual ULONG __stdcall AddRef()
{ return ++m_nRef; }
virtual ULONG __stdcall Release()
{
int nRef = --m_nRef;
if (!nRef)
delete this;
return nRef;
}
virtual HRESULT __stdcall QueryInterface(REFIID iid, void ** lppv)
{
if ((iid == IID_IUnknown) ||
(iid == m_iid))
{
*lppv = (LPUNKNOWN)(T1*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid2)
{
*lppv = (LPUNKNOWN)(T2*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid3)
{
*lppv = (LPUNKNOWN)(T3*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid4)
{
*lppv = (LPUNKNOWN)(T4*)this;
AddRef();
return S_OK;
}
else
{
*lppv = NULL;
return S_FALSE;
}
}
protected:
int m_nRef;
REFIID m_iid;
REFIID m_iid2;
REFIID m_iid3;
REFIID m_iid4;
};
template<class T1, class T2, class T3, class T4, class T5>
class TUnknown5 : public T1, public T2, public T3, public T4, public T5
{
public:
TUnknown5 (REFIID iid, REFIID iid2, REFIID iid3, REFIID iid4, REFIID iid5) :
m_nRef(1), m_iid(iid), m_iid2(iid2), m_iid3(iid3), m_iid4(iid4), m_iid5(iid5) {}
virtual ~TUnknown5() {}
virtual ULONG __stdcall AddRef()
{ return ++m_nRef; }
virtual ULONG __stdcall Release()
{
int nRef = --m_nRef;
if (!nRef)
delete this;
return nRef;
}
virtual HRESULT __stdcall QueryInterface(REFIID iid, void ** lppv)
{
if ((iid == IID_IUnknown) ||
(iid == m_iid))
{
*lppv = (LPUNKNOWN)(T1*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid2)
{
*lppv = (LPUNKNOWN)(T2*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid3)
{
*lppv = (LPUNKNOWN)(T3*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid4)
{
*lppv = (LPUNKNOWN)(T4*)this;
AddRef();
return S_OK;
}
else if (iid == m_iid5)
{
*lppv = (LPUNKNOWN)(T5*)this;
AddRef();
return S_OK;
}
else
{
*lppv = NULL;
return S_FALSE;
}
}
protected:
int m_nRef;
REFIID m_iid;
REFIID m_iid2;
REFIID m_iid3;
REFIID m_iid4;
REFIID m_iid5;
};
#endif // _TUNK_H_