sync with trunk r47346
[reactos.git] / dll / win32 / netshell / classfactory.c
1 #include <precomp.h>
2
3 typedef struct
4 {
5 const IClassFactoryVtbl *lpVtbl;
6 LONG ref;
7 CLSID *rclsid;
8 LPFNCREATEINSTANCE lpfnCI;
9 const IID * riidInst;
10 } IClassFactoryImpl;
11
12
13 static
14 HRESULT
15 WINAPI
16 IClassFactory_fnQueryInterface(
17 LPCLASSFACTORY iface,
18 REFIID riid,
19 LPVOID *ppvObj)
20 {
21 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
22
23 *ppvObj = NULL;
24 if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory))
25 {
26 *ppvObj = This;
27 InterlockedIncrement(&This->ref);
28 return S_OK;
29 }
30 return E_NOINTERFACE;
31 }
32
33 static
34 ULONG
35 WINAPI
36 IClassFactory_fnAddRef(
37 LPCLASSFACTORY iface)
38 {
39 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
40 ULONG refCount = InterlockedIncrement(&This->ref);
41
42 return refCount;
43 }
44
45 static
46 ULONG
47 WINAPI
48 IClassFactory_fnRelease(
49 LPCLASSFACTORY iface)
50 {
51 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
52 ULONG refCount = InterlockedDecrement(&This->ref);
53
54 if (!refCount)
55 {
56 CoTaskMemFree(This);
57 return 0;
58 }
59 return refCount;
60 }
61
62 static
63 HRESULT
64 WINAPI
65 IClassFactory_fnCreateInstance(
66 LPCLASSFACTORY iface,
67 LPUNKNOWN pUnkOuter,
68 REFIID riid,
69 LPVOID *ppvObject)
70 {
71 IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
72
73 *ppvObject = NULL;
74
75 if ( This->riidInst==NULL || IsEqualCLSID(riid, This->riidInst) || IsEqualCLSID(riid, &IID_IUnknown) )
76 {
77 return This->lpfnCI(pUnkOuter, riid, ppvObject);
78 }
79
80 return E_NOINTERFACE;
81 }
82
83 static
84 HRESULT
85 WINAPI IClassFactory_fnLockServer(
86 LPCLASSFACTORY iface,
87 BOOL fLock)
88 {
89 //IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
90 return E_NOTIMPL;
91 }
92
93
94 static const IClassFactoryVtbl dclfvt =
95 {
96 IClassFactory_fnQueryInterface,
97 IClassFactory_fnAddRef,
98 IClassFactory_fnRelease,
99 IClassFactory_fnCreateInstance,
100 IClassFactory_fnLockServer
101 };
102
103
104 IClassFactory *
105 IClassFactory_fnConstructor(
106 LPFNCREATEINSTANCE lpfnCI,
107 PLONG pcRefDll,
108 REFIID riidInst)
109 {
110 IClassFactoryImpl* lpclf;
111
112 lpclf = CoTaskMemAlloc(sizeof(IClassFactoryImpl));
113 lpclf->ref = 1;
114 lpclf->lpVtbl = &dclfvt;
115 lpclf->lpfnCI = lpfnCI;
116
117 if (pcRefDll)
118 InterlockedIncrement(pcRefDll);
119 lpclf->riidInst = riidInst;
120
121 return (LPCLASSFACTORY)lpclf;
122 }
123
124