Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS BDA Proxy * FILE: dll/directx/bdaplgin/classfactory.cpp * PURPOSE: ClassFactory interface * * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org) */#include "precomp.h"
const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
class CClassFactory : public IClassFactory{public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
STDMETHODIMP_(ULONG) AddRef() { InterlockedIncrement(&m_Ref); return m_Ref; } STDMETHODIMP_(ULONG) Release() { InterlockedDecrement(&m_Ref); if (!m_Ref) { delete this; return 0; } return m_Ref; }
HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject); HRESULT WINAPI LockServer(BOOL fLock);
CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst) {};
virtual ~CClassFactory(){};
protected: LONG m_Ref; LPFNCREATEINSTANCE m_lpfnCI; IID * m_IID;};
HRESULTWINAPICClassFactory::QueryInterface( REFIID riid, LPVOID *ppvObj){ *ppvObj = NULL; if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) { *ppvObj = PVOID(this); InterlockedIncrement(&m_Ref); return S_OK; } return E_NOINTERFACE;}
HRESULTWINAPICClassFactory::CreateInstance( LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject){ *ppvObject = NULL;
if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown)) { return m_lpfnCI(pUnkOuter, riid, ppvObject); }
return E_NOINTERFACE;}
HRESULTWINAPICClassFactory::LockServer( BOOL fLock){ return E_NOTIMPL;}
IClassFactory *CClassFactory_fnConstructor( LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID * riidInst){ CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst);
if (!factory) return NULL;
if (pcRefDll) InterlockedIncrement(pcRefDll);
return (LPCLASSFACTORY)factory;}