ReactOS  0.4.13-dev-259-g5ca9c9c
classfactory.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Configuration of network devices
4  * FILE: dll/directx/dsound_new/classfactory.c
5  * PURPOSE: IClassFactory implementation
6  *
7  * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
8  */
9 
10 
11 #include "precomp.h"
12 
13 typedef struct
14 {
15  const IClassFactoryVtbl *lpVtbl;
19  const IID * riidInst;
21 
22 
23 static
24 HRESULT
25 WINAPI
27  LPCLASSFACTORY iface,
28  REFIID riid,
29  LPVOID *ppvObj)
30 {
32 
33  *ppvObj = NULL;
34 
35  /* check requested interface */
37  {
38  *ppvObj = This;
40  return S_OK;
41  }
42  return E_NOINTERFACE;
43 }
44 
45 static
46 ULONG
47 WINAPI
49  LPCLASSFACTORY iface)
50 {
52 
53  /* increment reference count */
54  ULONG refCount = InterlockedIncrement(&This->ref);
55 
56  return refCount;
57 }
58 
59 static
60 ULONG
61 WINAPI
63  LPCLASSFACTORY iface)
64 {
66  ULONG refCount = InterlockedDecrement(&This->ref);
67 
68  /* decrement reference count */
69  if (!refCount)
70  {
71  /* free class factory */
73  return 0;
74  }
75  return refCount;
76 }
77 
78 static
79 HRESULT
80 WINAPI
82  LPCLASSFACTORY iface,
83  LPUNKNOWN pUnkOuter,
84  REFIID riid,
86 {
88 
89  if (!ppvObject)
90  return E_INVALIDARG;
91 
92  *ppvObject = NULL;
93 
94  if ( This->riidInst==NULL || IsEqualCLSID(riid, This->riidInst) || IsEqualCLSID(riid, &IID_IUnknown) )
95  {
96  /* instantiate object */
97  return This->lpfnCI(pUnkOuter, riid, ppvObject);
98  }
99 
100  return E_NOINTERFACE;
101 }
102 
103 static
104 HRESULT
106  LPCLASSFACTORY iface,
107  BOOL fLock)
108 {
109  //IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
110  return E_NOTIMPL;
111 }
112 
113 
114 static const IClassFactoryVtbl dclfvt =
115 {
121 };
122 
123 
124 IClassFactory *
127  PLONG pcRefDll,
128  REFIID riidInst)
129 {
130  IClassFactoryImpl* lpclf;
131 
132  lpclf = CoTaskMemAlloc(sizeof(IClassFactoryImpl));
133  lpclf->ref = 1;
134  lpclf->lpVtbl = &dclfvt;
135  lpclf->lpfnCI = lpfnCI;
136 
137  if (pcRefDll)
138  InterlockedIncrement(pcRefDll);
139  lpclf->riidInst = riidInst;
140 
141  return (LPCLASSFACTORY)lpclf;
142 }
143 
144 
#define REFIID
Definition: guiddef.h:113
#define E_NOINTERFACE
Definition: winerror.h:2364
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:422
REFIID riid
Definition: precomp.h:44
LPFNCREATEINSTANCE lpfnCI
Definition: classfactory.c:18
const IClassFactoryVtbl * lpVtbl
Definition: classfactory.c:15
LPFNCREATEINSTANCE lpfnCI
Definition: shellole.c:61
static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface)
Definition: classfactory.c:62
HRESULT(CALLBACK * LPFNCREATEINSTANCE)(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppvObject)
Definition: precomp.h:22
struct tagIClassFactoryImpl IClassFactoryImpl
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
static HRESULT WINAPI IClassFactory_fnQueryInterface(LPCLASSFACTORY iface, REFIID riid, LPVOID *ppvObj)
Definition: classfactory.c:26
const IID * riidInst
Definition: classfactory.c:19
static LPUNKNOWN
Definition: ndr_ole.c:49
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
LONG HRESULT
Definition: typedefs.h:77
const GUID IID_IUnknown
static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface, BOOL fLock)
Definition: classfactory.c:105
#define WINAPI
Definition: msvc.h:8
#define InterlockedDecrement
Definition: armddk.h:52
static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
Definition: classfactory.c:48
static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject)
Definition: classfactory.c:81
REFIID LPVOID * ppvObject
Definition: precomp.h:44
IClassFactory * IClassFactory_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst)
Definition: classfactory.c:125
#define S_OK
Definition: intsafe.h:59
#define InterlockedIncrement
Definition: armddk.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
unsigned int ULONG
Definition: retypes.h:1
const GUID IID_IClassFactory
signed int * PLONG
Definition: retypes.h:5
#define IsEqualCLSID(rclsid1, rclsid2)
Definition: guiddef.h:91
static const IClassFactoryVtbl dclfvt
Definition: classfactory.c:114
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:406
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:90