windows-nt/Source/XPSP1/NT/ds/security/passport/include/atlpool.h
2020-09-26 16:20:57 +08:00

62 lines
1.4 KiB
C++

#ifndef __ATLPOOL_H_
#define __ATLPOOL_H_
#include <atlbase.h>
#include <atlcom.h>
#include "PassportObjectPool.hpp"
//Base is the user's class that derives from CComObjectRoot and whatever
//interfaces the user wants to support on the object
template <class Base>
class CComObjectPooled : public Base
{
public:
typedef Base _BaseClass;
CComObjectPooled(void* = NULL) : m_Pool(NULL)
{
_Module.Lock();
}
// Set refcount to 1 to protect destruction
~CComObjectPooled()
{
m_dwRef = 1L;
FinalRelease();
#ifdef _ATL_DEBUG_INTERFACES
_Module.DeleteNonAddRefThunk(_GetRawUnknown());
#endif
_Module.Unlock();
}
//If InternalAddRef or InternalRelease is undefined then your class
//doesn't derive from CComObjectRoot
STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
STDMETHOD_(ULONG, Release)()
{
ULONG l = InternalRelease();
if (l == 0 && m_Pool)
m_Pool->checkin(this);
return l;
}
//if _InternalQueryInterface is undefined then you forgot BEGIN_COM_MAP
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
{return _InternalQueryInterface(iid, ppvObject);}
template <class Q>
HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp)
{
return QueryInterface(__uuidof(Q), (void**)pp);
}
void SetPool(PassportObjectPool< CComObjectPooled<Base> >* pPool)
{
m_Pool = pPool;
}
private:
void* m_Releaser;
PassportObjectPool< CComObjectPooled<Base> > *m_Pool;
};
#endif