CAbstractClassFactory.h
#include <objbase.h>
#include <unknwn.h>
#define DECLARE_IUNKNOWN_INTERFACE \
public: \
virtual HRESULT _stdcall QueryInterface(const IID& riid,void** ppvObject); \
virtual ULONG _stdcall AddRef (); \
virtual ULONG _stdcall Release();
class CAbstractClassFactory:public IClassFactory
{
public:
CAbstractClassFactory();
DECLARE_IUNKNOWN_INTERFACE
virtual HRESULT _stdcall CreateInstance(IUnknown *pUnkOuter,const IID& riid,void** ppvObject)=0;
virtual HRESULT _stdcall LockServer(BOOL fLock);
long m_caref,g_caref;
};
const CLSID CLSID_CAbstractClassFactory = {0x59F6C62A,0x50BE,0x4687,{0x95,0x80,0x59,0xC4,0x8F,0x94,0xE5,0xD8}};
CAbstractClassFactory.cpp
#include "CAbstractClassFactory.h"
CAbstractClassFactory::CAbstractClassFactory(){m_caref=1;g_caref=1;}
HRESULT _stdcall CAbstractClassFactory::QueryInterface(const IID& riid,void** ppvObject)
{
if(riid==IID_IUnknown||riid==IID_IClassFactory)
{
*ppvObject=static_cast<IClassFactory*>(this);
}
else
{
*ppvObject=NULL;
return E_NOINTERFACE;
}
return S_OK;
}
ULONG _stdcall CAbstractClassFactory::AddRef()
{
return InterlockedIncrement(&m_caref);
}
ULONG _stdcall CAbstractClassFactory::Release()
{
if(InterlockedDecrement(&m_caref)==0)
{
delete this;
return 0;
}
return m_caref;
}
HRESULT _stdcall CAbstractClassFactory::LockServer(BOOL fLock)
{
if(fLock)
{
InterlockedIncrement(&g_caref);
}
else
{
InterlockedDecrement(&g_caref);
}
return S_OK;
}