Reactos
at listview 112 lines 2.3 kB view raw
1/* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy 4 * FILE: dll/directx/ksproxy/classfactory.cpp 5 * PURPOSE: IClassFactory interface 6 * 7 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org) 8 */ 9#include "precomp.h" 10 11class CClassFactory : public IClassFactory 12{ 13public: 14 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); 15 16 STDMETHODIMP_(ULONG) AddRef() 17 { 18 InterlockedIncrement(&m_Ref); 19 return m_Ref; 20 } 21 STDMETHODIMP_(ULONG) Release() 22 { 23 InterlockedDecrement(&m_Ref); 24 25 if (!m_Ref) 26 { 27 delete this; 28 return 0; 29 } 30 return m_Ref; 31 } 32 33 HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject); 34 HRESULT WINAPI LockServer(BOOL fLock); 35 36 CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst) 37 {}; 38 39 virtual ~CClassFactory(){}; 40 41protected: 42 LONG m_Ref; 43 LPFNCREATEINSTANCE m_lpfnCI; 44 IID * m_IID; 45}; 46 47HRESULT 48WINAPI 49CClassFactory::QueryInterface( 50 REFIID riid, 51 LPVOID *ppvObj) 52{ 53 *ppvObj = NULL; 54 if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) 55 { 56 *ppvObj = PVOID(this); 57 InterlockedIncrement(&m_Ref); 58 return S_OK; 59 } 60 return E_NOINTERFACE; 61} 62 63HRESULT 64WINAPI 65CClassFactory::CreateInstance( 66 LPUNKNOWN pUnkOuter, 67 REFIID riid, 68 LPVOID *ppvObject) 69{ 70 WCHAR Buffer[MAX_PATH]; 71 LPOLESTR lpstr; 72 73 *ppvObject = NULL; 74 75 StringFromCLSID(riid, &lpstr); 76 77 swprintf(Buffer, L"riid %s", lpstr); 78 OutputDebugStringW(Buffer); 79 80 81 if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown)) 82 { 83 return m_lpfnCI(pUnkOuter, riid, ppvObject); 84 } 85 86 return E_NOINTERFACE; 87} 88 89HRESULT 90WINAPI 91CClassFactory::LockServer( 92 BOOL fLock) 93{ 94 return E_NOTIMPL; 95} 96 97IClassFactory * 98CClassFactory_fnConstructor( 99 LPFNCREATEINSTANCE lpfnCI, 100 PLONG pcRefDll, 101 IID * riidInst) 102{ 103 CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst); 104 105 if (!factory) 106 return NULL; 107 108 if (pcRefDll) 109 InterlockedIncrement(pcRefDll); 110 111 return (LPCLASSFACTORY)factory; 112}