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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
//+-------------------------------------------------------------------
//
// File: ballscf.cxx
//
// Contents: test class factory object implementation
//
// Classes: CBallClassFactory
//
// Functions:
//
// History: 23-Nov-92 Rickhi Created
//
//--------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <ballscf.hxx> // class definiton
#include <cballs.hxx> // CBalls defines
const GUID CLSID_Balls =
{0x0000013a,0x0001,0x0008,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
//+-------------------------------------------------------------------
//
// Member: CBallClassFactory::CBallClassFactory, public
//
// Algorithm:
//
// History: 23-Nov-92 Rickhi Created
//
//--------------------------------------------------------------------
CBallClassFactory::CBallClassFactory(IUnknown *punkOuter) :
_punkOuter(punkOuter)
{
ENLIST_TRACKING(CBallClassFactory);
}
//+-------------------------------------------------------------------
//
// Member: CBallClassFactory::~CBallClassFactory, public
//
// Algorithm:
//
// History: 23-Nov-92 Rickhi Created
//
//--------------------------------------------------------------------
CBallClassFactory::~CBallClassFactory(void)
{
// automatic actions do the rest of the work
}
//+-------------------------------------------------------------------
//
// Member: CBallClassFactory::QueryInterface, public
//
// Algorithm: if the interface is not one implemented by us,
// pass the request to the proxy manager
//
// History: 23-Nov-92 Rickhi Created
//
//--------------------------------------------------------------------
STDMETHODIMP CBallClassFactory::QueryInterface(REFIID riid, void **ppUnk)
{
SCODE sc = S_OK;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_IClassFactory))
{
*ppUnk = (void *)(IClassFactory *) this;
AddRef();
}
else
{
if (_punkOuter)
{
sc = _punkOuter->QueryInterface(riid, ppUnk);
}
else
{
*ppUnk = NULL;
sc = E_NOINTERFACE;
}
}
return sc;
}
//+-------------------------------------------------------------------
//
// Member: CBallClassFactory::CreateInstance, public
//
// Synopsis: create a new object with the same class
//
// History: 23-Nov-92 Rickhi Created
//
//--------------------------------------------------------------------
STDMETHODIMP CBallClassFactory::CreateInstance(IUnknown *punkOuter,
REFIID riid,
void **ppunkObject)
{
SCODE sc = E_OUTOFMEMORY;
*ppunkObject = NULL; // in case of failure
// create a ball object.
IUnknown *punk = (IUnknown *) new CBallCtrlUnk(punkOuter);
if (punk)
{
// get the interface the caller wants to use
sc = punk->QueryInterface(riid, ppunkObject);
// release our hold on the ball, since the QI got a hold for
// the client.
punk->Release();
}
return sc;
}
//+-------------------------------------------------------------------
//
// Member: CBallClassFactory::LockServer, public
//
// Synopsis: create a new object with the same class
//
// History: 23-Nov-92 Rickhi Created
//
//--------------------------------------------------------------------
STDMETHODIMP CBallClassFactory::LockServer(BOOL fLock)
{
if (fLock)
GlobalRefs(TRUE);
else
GlobalRefs(FALSE);
return S_OK;
}
|