11 #define P6COMHLPR_H__ 1
55 #define VALIDATEIF(type,ptr) IID_##type, reinterpret_cast<P6R::P6VOID**>(static_cast<type**>(ptr))
58 #define P6_DECL_ICOM \
59 P6COMMETHOD queryInterface(const P6REFIID iid,P6R::P6VOID **ppIface);\
60 P6COMMETHOD_(P6R::P6INT32) addref(); \
61 P6COMMETHOD_(P6R::P6INT32) release(); \
62 static P6R::P6ERR createInstance(P6R::p6ICom *pOuter,const P6REFIID iid,P6R::P6VOID **ppNewComponent); \
63 P6R::P6AUTO_INT32 m_cRef
66 #define P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname) \
67 P6R::P6ERR classname::createInstance(P6R::p6ICom *pOuter,const P6REFIID iid,P6R::P6VOID **ppNewComponent) \
70 classname *pObj = NULL; \
72 return P6R::eNoAgregation; \
73 if(NULL == ppNewComponent) \
74 return P6R::eAccessFault; \
75 *ppNewComponent = NULL; \
76 if(NULL == (pObj = new (std::nothrow) classname())) { \
77 *ppNewComponent = NULL; \
78 return P6R::eNoMemory; \
81 if(1 == pObj->m_cRef.value) { \
82 err = pObj->queryInterface(iid,ppNewComponent); \
85 err = eInvalidRefcount; \
91 #define P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
92 P6R::P6INT32 classname::addref() { \
93 P6R::P6INT32 tmp = P6R::p6AtomicInc32(&m_cRef.value); \
94 P6R::p6TraceAddref((const P6R::P6CHAR*)#classname,sizeof(*this),this,tmp,NULL); \
98 #define P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
99 P6R::P6INT32 classname::release() { \
100 P6ASSERT(0 != m_cRef.value); \
101 P6R::P6INT32 tmp = P6R::p6AtomicDec32(&m_cRef.value); \
102 P6R::p6TraceRelease((const P6R::P6CHAR*)#classname,this,tmp,NULL); \
103 if(0 == tmp) { delete this; } \
107 #define P6_IMPLEMENT_ICOM1(classname,interface1) \
108 P6R::P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) \
111 return P6R::eAccessFault; \
113 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
114 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
115 else return P6R::eNoInterface; \
116 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
119 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
120 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
121 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
123 #define P6_IMPLEMENT_ICOM2(classname,interface1,interface2) \
124 P6R::P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
126 return P6R::eAccessFault; \
128 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
129 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
130 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
131 else return P6R::eNoInterface; \
132 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
135 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
136 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
137 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
139 #define P6_IMPLEMENT_ICOM3(classname,interface1,interface2,interface3) \
140 P6R::P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
142 return P6R::eAccessFault; \
144 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
145 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
146 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
147 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
148 else return P6R::eNoInterface; \
149 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
152 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
153 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
154 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
156 #define P6_IMPLEMENT_ICOM4(classname,interface1,interface2,interface3,interface4) \
157 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
159 return P6R::eAccessFault; \
161 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
162 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
163 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
164 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
165 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
166 else return P6R::eNoInterface; \
167 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
170 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
171 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
172 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
174 #define P6_IMPLEMENT_ICOM5(classname,interface1,interface2,interface3,interface4,interface5) \
175 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
177 return P6R::eAccessFault; \
179 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
180 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
181 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
182 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
183 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
184 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
185 else return P6R::eNoInterface; \
186 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
189 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
190 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
191 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
193 #define P6_IMPLEMENT_ICOM6(classname,interface1,interface2,interface3,interface4,interface5,interface6) \
194 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
196 return P6R::eAccessFault; \
198 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
199 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
200 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
201 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
202 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
203 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
204 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
205 else return P6R::eNoInterface; \
206 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
209 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
210 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
211 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
213 #define P6_IMPLEMENT_ICOM7(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7) \
214 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
216 return P6R::eAccessFault; \
218 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
219 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
220 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
221 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
222 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
223 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
224 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
225 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
226 else return P6R::eNoInterface; \
227 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
230 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
231 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
232 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
234 #define P6_IMPLEMENT_ICOM8(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8) \
235 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
237 return P6R::eAccessFault; \
239 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
240 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
241 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
242 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
243 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
244 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
245 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
246 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
247 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
248 else return P6R::eNoInterface; \
249 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
252 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
253 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
254 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
256 #define P6_IMPLEMENT_ICOM9(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9) \
257 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
259 return P6R::eAccessFault; \
261 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
262 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
263 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
264 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
265 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
266 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
267 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
268 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
269 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
270 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
271 else return P6R::eNoInterface; \
272 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
275 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
276 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
277 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
279 #define P6_IMPLEMENT_ICOM10(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10) \
280 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
282 return P6R::eAccessFault; \
284 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
285 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
286 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
287 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
288 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
289 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
290 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
291 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
292 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
293 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
294 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
295 else return P6R::eNoInterface; \
296 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
299 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
300 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
301 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
303 #define P6_IMPLEMENT_ICOM11(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11) \
304 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
306 return P6R::eAccessFault; \
308 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
309 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
310 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
311 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
312 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
313 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
314 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
315 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
316 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
317 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
318 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
319 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
320 else return P6R::eNoInterface; \
321 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
324 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
325 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
326 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
328 #define P6_IMPLEMENT_ICOM12(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12) \
329 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
331 return P6R::eAccessFault; \
333 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
334 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
335 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
336 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
337 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
338 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
339 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
340 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
341 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
342 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
343 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
344 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
345 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
346 else return P6R::eNoInterface; \
347 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
350 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
351 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
352 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
354 #define P6_IMPLEMENT_ICOM13(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13) \
355 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
357 return P6R::eAccessFault; \
359 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
360 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
361 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
362 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
363 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
364 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
365 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
366 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
367 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
368 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
369 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
370 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
371 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
372 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
373 else return P6R::eNoInterface; \
374 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
377 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
378 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
379 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
381 #define P6_IMPLEMENT_ICOM14(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14) \
382 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
384 return P6R::eAccessFault; \
386 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
387 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
388 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
389 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
390 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
391 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
392 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
393 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
394 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
395 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
396 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
397 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
398 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
399 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
400 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
401 else return P6R::eNoInterface; \
402 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
405 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
406 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
407 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
409 #define P6_IMPLEMENT_ICOM15(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15) \
410 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
412 return P6R::eAccessFault; \
414 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
415 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
416 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
417 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
418 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
419 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
420 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
421 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
422 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
423 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
424 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
425 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
426 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
427 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
428 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
429 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
430 else return P6R::eNoInterface; \
431 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
434 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
435 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
436 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
438 #define P6_IMPLEMENT_ICOM16(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16) \
439 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
441 return P6R::eAccessFault; \
443 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
444 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
445 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
446 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
447 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
448 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
449 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
450 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
451 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
452 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
453 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
454 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
455 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
456 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
457 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
458 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
459 else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
460 else return P6R::eNoInterface; \
461 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
464 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
465 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
466 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
468 #define P6_IMPLEMENT_ICOM17(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16,interface17) \
469 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
471 return P6R::eAccessFault; \
473 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
474 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
475 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
476 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
477 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
478 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
479 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
480 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
481 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
482 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
483 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
484 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
485 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
486 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
487 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
488 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
489 else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
490 else if(iid == IID_##interface17) *ppv = static_cast<interface17*>(this); \
491 else return P6R::eNoInterface; \
492 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
495 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
496 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
497 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
520 #define P6_REFCOUNTED_CREATEINSTANCE(classname) \
521 static P6R::P6ERR createInstance(classname **ppNewComponent) \
524 classname *pObj = NULL; \
525 if(NULL == ppNewComponent) \
526 return P6R::eAccessFault; \
527 *ppNewComponent = NULL; \
528 if(NULL == (pObj = new (std::nothrow) classname())) { \
529 *ppNewComponent = NULL; \
530 return P6R::eNoMemory; \
533 if(1 == pObj->m_cRef.value) { \
534 (*ppNewComponent) = pObj; \
535 (*ppNewComponent)->addref(); \
539 err = P6R::eInvalidRefcount; \
557 #define P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
558 P6COMMETHOD_(P6R::P6INT32) addref() { \
559 P6R::P6INT32 tmp = P6R::p6AtomicInc32(&m_cRef.value); \
560 P6R::p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
576 #define P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
577 P6COMMETHOD_(P6R::P6INT32) release() { \
578 P6ASSERT(0 != m_cRef.value); \
579 P6R::P6INT32 tmp = P6R::p6AtomicDec32(&m_cRef.value); \
580 P6R::p6TraceRelease(#classname,this,tmp,NULL); \
581 if(0 == tmp) { delete this; } \
613 #define P6_REFCOUNTED(classname) \
614 P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
615 P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
616 P6_REFCOUNTED_CREATEINSTANCE(classname) \
617 P6R::P6AUTO_INT32 m_cRef
621 #define P6REFCOUNTEDCLASS(classname) \
623 P6COMMETHOD_(P6R::P6INT32) addref() \
624 { P6R::P6INT32 tmp = P6R::p6AtomicInc32(&m_cRef.value); \
625 P6R::p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
627 P6COMMETHOD_(P6R::P6INT32) release() \
628 { P6R::P6INT32 tmp = P6R::p6AtomicDec32(&m_cRef.value); \
629 P6R::p6TraceRelease(#classname,this,tmp,NULL); \
630 if(0 == tmp) { delete this; } \
632 P6R::P6AUTO_INT32 m_cRef
646 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA g_sComponentDataArray[] = {
648 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
651 (P6CREATEINST) (createInst), \
653 (const P6CATEGORYDATA*)(categories), \
657 #define P6END_COMPONENT_TABLE() }; \
658 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
663 #define P6BEGIN_CATAGORY_TABLE(table_name) static const P6CATEGORYDATA table_name[] = {
665 #define P6ADD_CATAGORY(catid,catagory_name) \
667 ((const P6R::P6CATID*)&(CATID_##catid)), \
671 #define P6END_CATAGORY_TABLE(table_name) }; \
672 static P6R::P6UINT32 table_name##SZ = sizeof(table_name) / sizeof(P6CATEGORYDATA)
676 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd) \
677 static P6R::P6INT32 g_cActiveComponents = 0; \
678 extern "C" P6EXPORT P6R::P6ERR P6CCALL p6GetIModule(P6R::p6IModule **ppModule) \
680 return p6GlueGetIModule(&g_sComponentDataArray[0], \
681 g_cComponentDataEntries, \
682 &g_cActiveComponents, \
683 ppModule,(verInfo),(dllStart),(dllEnd)); \
692 #define P6TRACECTOR(c) p6TraceCTOR(#c,sizeof(*this),this,NULL)
693 #define P6TRACEDTOR() p6TraceDTOR("",this,NULL)
697 #endif // __cplusplus
P6COM definitions and interfaces.