blob: 0618862dc05f288efd66845865b5344ac3740370 (
plain)
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
|
/*
* Copyright (c) 2003, Sergey Zorin. All rights reserved.
*
* This software is distributable under the BSD license. See the terms
* of the BSD license in the LICENSE file provided with this software.
*
*/
#include "class_factory.h"
#include "diff_ext.h"
#include "server.h"
CLASS_FACTORY::CLASS_FACTORY() {
_ref_count = 0L;
SERVER::instance()->lock();
}
CLASS_FACTORY::~CLASS_FACTORY() {
SERVER::instance()->release();
}
STDMETHODIMP
CLASS_FACTORY::QueryInterface(REFIID riid, void** ppv) {
HRESULT ret = E_NOINTERFACE;
*ppv = 0;
if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) {
*ppv = static_cast<CLASS_FACTORY*>(this);
AddRef();
ret = NOERROR;
}
return ret;
}
STDMETHODIMP_(ULONG)
CLASS_FACTORY::AddRef() {
return InterlockedIncrement((LPLONG)&_ref_count);
}
STDMETHODIMP_(ULONG)
CLASS_FACTORY::Release() {
ULONG ret = 0L;
if(InterlockedDecrement((LPLONG)&_ref_count) != 0)
ret = _ref_count;
else
delete this;
return ret;
}
STDMETHODIMP
CLASS_FACTORY::CreateInstance(IUnknown* outer, REFIID refiid, void** obj) {
HRESULT ret = CLASS_E_NOAGGREGATION;
*obj = 0;
// Shell extensions typically don't support aggregation (inheritance)
if(outer == 0) {
DIFF_EXT* ext = new DIFF_EXT();
if(ext == 0)
ret = E_OUTOFMEMORY;
else
ret = ext->QueryInterface(refiid, obj);
}
return ret;
}
STDMETHODIMP
CLASS_FACTORY::LockServer(BOOL) {
return NOERROR;
}
|