-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathClassFactory.cpp
86 lines (73 loc) · 1.54 KB
/
ClassFactory.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "ClassFactory.h"
#include "DeskClock.h"
extern unsigned long g_cDllRef;
CClassFactory::CClassFactory()
{
m_cRef = 1;
InterlockedIncrement(&g_cDllRef);
}
CClassFactory::~CClassFactory()
{
InterlockedDecrement(&g_cDllRef);
}
//
// IUnknown
//
STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, void **ppv)
{
HRESULT hr = S_OK;
if (IsEqualIID(IID_IUnknown, riid) || IsEqualIID(IID_IClassFactory, riid))
{
*ppv = static_cast<IUnknown *>(this);
AddRef();
}
else
{
hr = E_NOINTERFACE;
*ppv = NULL;
}
return hr;
}
STDMETHODIMP_(ULONG) CClassFactory::AddRef()
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG) CClassFactory::Release()
{
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
}
return cRef;
}
//
// IClassFactory
//
STDMETHODIMP CClassFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv)
{
HRESULT hr = CLASS_E_NOAGGREGATION;
if (!pUnkOuter)
{
hr = E_OUTOFMEMORY;
CDeskClock *pDeskClock = new CDeskClock();
if (pDeskClock)
{
hr = pDeskClock->QueryInterface(riid, ppv);
pDeskClock->Release();
}
}
return hr;
}
STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
{
if (fLock)
{
InterlockedIncrement(&g_cDllRef);
}
else
{
InterlockedDecrement(&g_cDllRef);
}
return S_OK;
}