11 #define P6COMHLPR_H__ 1
54 #define VALIDATEIF(type,ptr) IID_##type, reinterpret_cast<P6R::P6VOID**>(static_cast<type**>(ptr))
57 #define P6_DECL_ICOM \
58 P6COMMETHOD queryInterface(const P6R::IID &iid,P6R::P6VOID **ppIface);\
59 P6COMMETHOD_(P6R::P6INT32) addref(); \
60 P6COMMETHOD_(P6R::P6INT32) release(); \
61 static P6R::P6ERR createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent); \
62 P6R::P6AUTO_INT32 m_cRef
65 #define P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname) \
66 P6R::P6ERR classname::createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent) \
69 classname *pObj = NULL; \
71 return P6R::eNoAgregation; \
72 if(NULL == ppNewComponent) \
73 return P6R::eAccessFault; \
74 *ppNewComponent = NULL; \
75 if(NULL == (pObj = new (std::nothrow) classname())) { \
76 *ppNewComponent = NULL; \
77 return P6R::eNoMemory; \
80 if(1 == pObj->m_cRef.value) { \
81 err = pObj->queryInterface(iid,ppNewComponent); \
84 err = eInvalidRefcount; \
90 #define P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
91 P6R::P6INT32 classname::addref() { \
92 P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); \
93 p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
97 #define P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
98 P6R::P6INT32 classname::release() { \
99 P6ASSERT(0 != m_cRef.value); \
100 P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef.value); \
101 p6TraceRelease(#classname,this,tmp,NULL); \
102 if(0 == tmp) { delete this; } \
106 #define P6_IMPLEMENT_ICOM1(classname,interface1) \
107 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) \
110 return P6R::eAccessFault; \
112 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
113 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
114 else return P6R::eNoInterface; \
115 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
118 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
119 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
120 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
122 #define P6_IMPLEMENT_ICOM2(classname,interface1,interface2) \
123 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
125 return P6R::eAccessFault; \
127 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
128 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
129 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
130 else return P6R::eNoInterface; \
131 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
134 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
135 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
136 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
138 #define P6_IMPLEMENT_ICOM3(classname,interface1,interface2,interface3) \
139 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
141 return P6R::eAccessFault; \
143 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
144 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
145 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
146 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
147 else return P6R::eNoInterface; \
148 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
151 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
152 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
153 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
155 #define P6_IMPLEMENT_ICOM4(classname,interface1,interface2,interface3,interface4) \
156 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
158 return P6R::eAccessFault; \
160 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
161 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
162 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
163 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
164 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
165 else return P6R::eNoInterface; \
166 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
169 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
170 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
171 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
173 #define P6_IMPLEMENT_ICOM5(classname,interface1,interface2,interface3,interface4,interface5) \
174 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
176 return P6R::eAccessFault; \
178 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
179 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
180 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
181 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
182 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
183 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
184 else return P6R::eNoInterface; \
185 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
188 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
189 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
190 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
192 #define P6_IMPLEMENT_ICOM6(classname,interface1,interface2,interface3,interface4,interface5,interface6) \
193 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
195 return P6R::eAccessFault; \
197 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
198 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
199 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
200 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
201 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
202 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
203 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
204 else return P6R::eNoInterface; \
205 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
208 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
209 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
210 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
212 #define P6_IMPLEMENT_ICOM7(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7) \
213 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
215 return P6R::eAccessFault; \
217 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
218 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
219 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
220 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
221 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
222 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
223 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
224 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
225 else return P6R::eNoInterface; \
226 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
229 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
230 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
231 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
233 #define P6_IMPLEMENT_ICOM8(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8) \
234 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
236 return P6R::eAccessFault; \
238 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
239 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
240 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
241 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
242 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
243 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
244 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
245 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
246 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
247 else return P6R::eNoInterface; \
248 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
251 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
252 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
253 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
255 #define P6_IMPLEMENT_ICOM9(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9) \
256 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
258 return P6R::eAccessFault; \
260 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
261 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
262 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
263 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
264 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
265 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
266 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
267 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
268 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
269 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
270 else return P6R::eNoInterface; \
271 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
274 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
275 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
276 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
278 #define P6_IMPLEMENT_ICOM10(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10) \
279 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
281 return P6R::eAccessFault; \
283 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
284 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
285 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
286 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
287 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
288 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
289 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
290 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
291 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
292 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
293 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
294 else return P6R::eNoInterface; \
295 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
298 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
299 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
300 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
302 #define P6_IMPLEMENT_ICOM11(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11) \
303 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
305 return P6R::eAccessFault; \
307 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
308 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
309 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
310 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
311 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
312 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
313 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
314 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
315 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
316 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
317 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
318 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
319 else return P6R::eNoInterface; \
320 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
323 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
324 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
325 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
327 #define P6_IMPLEMENT_ICOM12(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12) \
328 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
330 return P6R::eAccessFault; \
332 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
333 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
334 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
335 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
336 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
337 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
338 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
339 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
340 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
341 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
342 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
343 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
344 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
345 else return P6R::eNoInterface; \
346 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
349 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
350 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
351 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
353 #define P6_IMPLEMENT_ICOM13(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13) \
354 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
356 return P6R::eAccessFault; \
358 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
359 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
360 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
361 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
362 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
363 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
364 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
365 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
366 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
367 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
368 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
369 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
370 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
371 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
372 else return P6R::eNoInterface; \
373 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
376 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
377 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
378 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
380 #define P6_IMPLEMENT_ICOM14(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14) \
381 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
383 return P6R::eAccessFault; \
385 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
386 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
387 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
388 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
389 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
390 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
391 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
392 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
393 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
394 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
395 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
396 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
397 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
398 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
399 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
400 else return P6R::eNoInterface; \
401 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
404 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
405 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
406 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
408 #define P6_IMPLEMENT_ICOM15(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15) \
409 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
411 return P6R::eAccessFault; \
413 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
414 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
415 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
416 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
417 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
418 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
419 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
420 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
421 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
422 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
423 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
424 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
425 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
426 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
427 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
428 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
429 else return P6R::eNoInterface; \
430 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
433 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
434 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
435 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
437 #define P6_IMPLEMENT_ICOM16(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16) \
438 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
440 return P6R::eAccessFault; \
442 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
443 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
444 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
445 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
446 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
447 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
448 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
449 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
450 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
451 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
452 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
453 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
454 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
455 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
456 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
457 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
458 else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
459 else return P6R::eNoInterface; \
460 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
463 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
464 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
465 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
467 #define P6_IMPLEMENT_ICOM17(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16,interface17) \
468 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
470 return P6R::eAccessFault; \
472 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
473 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
474 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
475 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
476 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
477 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
478 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
479 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
480 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
481 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
482 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
483 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
484 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
485 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
486 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
487 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
488 else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
489 else if(iid == IID_##interface17) *ppv = static_cast<interface17*>(this); \
490 else return P6R::eNoInterface; \
491 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
494 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
495 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
496 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
519 #define P6_REFCOUNTED_CREATEINSTANCE(classname) \
520 static P6R::P6ERR createInstance(classname **ppNewComponent) \
523 classname *pObj = NULL; \
524 if(NULL == ppNewComponent) \
525 return P6R::eAccessFault; \
526 *ppNewComponent = NULL; \
527 if(NULL == (pObj = new (std::nothrow) classname())) { \
528 *ppNewComponent = NULL; \
529 return P6R::eNoMemory; \
532 if(1 == pObj->m_cRef.value) { \
533 (*ppNewComponent) = pObj; \
534 (*ppNewComponent)->addref(); \
538 err = P6R::eInvalidRefcount; \
556 #define P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
557 P6COMMETHOD_(P6R::P6INT32) addref() { \
558 P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); \
559 p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
575 #define P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
576 P6COMMETHOD_(P6R::P6INT32) release() { \
577 P6ASSERT(0 != m_cRef.value); \
578 P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef.value); \
579 p6TraceRelease(#classname,this,tmp,NULL); \
580 if(0 == tmp) { delete this; } \
612 #define P6_REFCOUNTED(classname) \
613 P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
614 P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
615 P6_REFCOUNTED_CREATEINSTANCE(classname) \
616 P6R::P6AUTO_INT32 m_cRef
620 #define P6REFCOUNTEDCLASS(classname) \
622 P6COMMETHOD_(P6R::P6INT32) addref() \
623 { P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); \
624 p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
626 P6COMMETHOD_(P6R::P6INT32) release() \
627 { P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef.value); \
628 p6TraceRelease(#classname,this,tmp,NULL); \
629 if(0 == tmp) { delete this; } \
631 P6R::P6AUTO_INT32 m_cRef
645 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA g_sComponentDataArray[] = {
647 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
650 (P6CREATEINST) (createInst), \
652 (const P6CATEGORYDATA*)(categories), \
656 #define P6END_COMPONENT_TABLE() }; \
657 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
662 #define P6BEGIN_CATAGORY_TABLE(table_name) static const P6CATEGORYDATA table_name[] = {
664 #define P6ADD_CATAGORY(catid,catagory_name) \
666 ((const P6R::CATID*)&(CATID_##catid)), \
670 #define P6END_CATAGORY_TABLE(table_name) }; \
671 static P6R::P6INT32 table_name##SZ = sizeof(table_name) / sizeof(P6CATEGORYDATA)
675 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd) \
676 static P6R::P6INT32 g_cActiveComponents = 0; \
677 extern "C" P6EXPORT P6R::P6ERR p6GetIModule(P6R::p6IModule **ppModule) \
679 return p6GlueGetIModule(&g_sComponentDataArray[0], \
680 g_cComponentDataEntries, \
681 &g_cActiveComponents, \
682 ppModule,(verInfo),(dllStart),(dllEnd)); \
691 #define P6TRACECTOR(c) p6TraceCTOR(#c,sizeof(*this),this,NULL)
692 #define P6TRACEDTOR() p6TraceDTOR("",this,NULL)
P6COM definitions and interfaces.