mirror of
https://github.com/reactos/reactos.git
synced 2024-08-27 13:48:42 +00:00
106 lines
2.3 KiB
C++
106 lines
2.3 KiB
C++
/*
|
|
* 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;
|
|
};
|
|
|
|
HRESULT
|
|
WINAPI
|
|
CClassFactory::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;
|
|
}
|
|
|
|
HRESULT
|
|
WINAPI
|
|
CClassFactory::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;
|
|
}
|
|
|
|
HRESULT
|
|
WINAPI
|
|
CClassFactory::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;
|
|
}
|