mirror of
https://github.com/reactos/reactos.git
synced 2024-11-07 07:00:19 +00:00
527f2f9057
* Create a branch for some evul shell experiments. svn path=/branches/shell-experiments/; revision=61927
124 lines
2.3 KiB
C
124 lines
2.3 KiB
C
#include "precomp.h"
|
|
|
|
typedef struct
|
|
{
|
|
const IClassFactoryVtbl *lpVtbl;
|
|
LONG ref;
|
|
CLSID *rclsid;
|
|
LPFNCREATEINSTANCE lpfnCI;
|
|
const IID * riidInst;
|
|
} IClassFactoryImpl;
|
|
|
|
|
|
static
|
|
HRESULT
|
|
WINAPI
|
|
IClassFactory_fnQueryInterface(
|
|
LPCLASSFACTORY iface,
|
|
REFIID riid,
|
|
LPVOID *ppvObj)
|
|
{
|
|
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
|
|
|
|
*ppvObj = NULL;
|
|
if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory))
|
|
{
|
|
*ppvObj = This;
|
|
InterlockedIncrement(&This->ref);
|
|
return S_OK;
|
|
}
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
static
|
|
ULONG
|
|
WINAPI
|
|
IClassFactory_fnAddRef(
|
|
LPCLASSFACTORY iface)
|
|
{
|
|
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
|
|
ULONG refCount = InterlockedIncrement(&This->ref);
|
|
|
|
return refCount;
|
|
}
|
|
|
|
static
|
|
ULONG
|
|
WINAPI
|
|
IClassFactory_fnRelease(
|
|
LPCLASSFACTORY iface)
|
|
{
|
|
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
|
|
ULONG refCount = InterlockedDecrement(&This->ref);
|
|
|
|
if (!refCount)
|
|
{
|
|
CoTaskMemFree(This);
|
|
return 0;
|
|
}
|
|
return refCount;
|
|
}
|
|
|
|
static
|
|
HRESULT
|
|
WINAPI
|
|
IClassFactory_fnCreateInstance(
|
|
LPCLASSFACTORY iface,
|
|
LPUNKNOWN pUnkOuter,
|
|
REFIID riid,
|
|
LPVOID *ppvObject)
|
|
{
|
|
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
|
|
|
|
*ppvObject = NULL;
|
|
|
|
if ( This->riidInst==NULL || IsEqualCLSID(riid, This->riidInst) || IsEqualCLSID(riid, &IID_IUnknown) )
|
|
{
|
|
return This->lpfnCI(pUnkOuter, riid, ppvObject);
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
static
|
|
HRESULT
|
|
WINAPI IClassFactory_fnLockServer(
|
|
LPCLASSFACTORY iface,
|
|
BOOL fLock)
|
|
{
|
|
//IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
static const IClassFactoryVtbl dclfvt =
|
|
{
|
|
IClassFactory_fnQueryInterface,
|
|
IClassFactory_fnAddRef,
|
|
IClassFactory_fnRelease,
|
|
IClassFactory_fnCreateInstance,
|
|
IClassFactory_fnLockServer
|
|
};
|
|
|
|
|
|
IClassFactory *
|
|
IClassFactory_fnConstructor(
|
|
LPFNCREATEINSTANCE lpfnCI,
|
|
PLONG pcRefDll,
|
|
REFIID riidInst)
|
|
{
|
|
IClassFactoryImpl* lpclf;
|
|
|
|
lpclf = CoTaskMemAlloc(sizeof(IClassFactoryImpl));
|
|
lpclf->ref = 1;
|
|
lpclf->lpVtbl = &dclfvt;
|
|
lpclf->lpfnCI = lpfnCI;
|
|
|
|
if (pcRefDll)
|
|
InterlockedIncrement(pcRefDll);
|
|
lpclf->riidInst = riidInst;
|
|
|
|
return (LPCLASSFACTORY)lpclf;
|
|
}
|
|
|
|
|