11 #define P6COMHLPR_H__ 1
52 #define VALIDATEIF(type,ptr) IID_##type, reinterpret_cast<P6R::P6VOID**>(static_cast<type**>(ptr))
55 #define P6_DECL_ICOM \
56 P6COMMETHOD queryInterface(const P6R::IID &iid,P6R::P6VOID **ppIface);\
57 P6COMMETHOD_(P6R::P6INT32) addref(); \
58 P6COMMETHOD_(P6R::P6INT32) release(); \
59 static P6R::P6ERR createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent); \
60 P6R::P6AUTO_INT32 m_cRef
63 #define P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname) \
64 P6R::P6ERR classname::createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent) \
67 classname *pObj = NULL; \
69 return P6R::eNoAgregation; \
70 if(NULL == ppNewComponent) \
71 return P6R::eAccessFault; \
72 *ppNewComponent = NULL; \
73 if(NULL == (pObj = new classname())) { \
74 *ppNewComponent = NULL; \
75 return P6R::eNoMemory; \
78 if(1 == pObj->m_cRef.value) { \
79 err = pObj->queryInterface(iid,ppNewComponent); \
82 err = eInvalidRefcount; \
88 #define P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
89 P6R::P6INT32 classname::addref() { \
90 P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); \
91 p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
95 #define P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
96 P6R::P6INT32 classname::release() { \
97 P6ASSERT(0 != m_cRef.value); \
98 P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef.value); \
99 p6TraceRelease(#classname,this,tmp,NULL); \
100 if(0 == tmp) { delete this; } \
104 #define P6_IMPLEMENT_ICOM1(classname,interface1) \
105 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) \
108 return P6R::eAccessFault; \
110 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
111 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
112 else return P6R::eNoInterface; \
113 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
116 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
117 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
118 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
120 #define P6_IMPLEMENT_ICOM2(classname,interface1,interface2) \
121 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
123 return P6R::eAccessFault; \
125 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
126 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
127 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
128 else return P6R::eNoInterface; \
129 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
132 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
133 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
134 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
136 #define P6_IMPLEMENT_ICOM3(classname,interface1,interface2,interface3) \
137 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
139 return P6R::eAccessFault; \
141 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
142 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
143 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
144 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
145 else return P6R::eNoInterface; \
146 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
149 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
150 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
151 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
153 #define P6_IMPLEMENT_ICOM4(classname,interface1,interface2,interface3,interface4) \
154 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
156 return P6R::eAccessFault; \
158 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
159 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
160 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
161 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
162 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
163 else return P6R::eNoInterface; \
164 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
167 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
168 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
169 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
171 #define P6_IMPLEMENT_ICOM5(classname,interface1,interface2,interface3,interface4,interface5) \
172 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
174 return P6R::eAccessFault; \
176 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
177 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
178 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
179 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
180 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
181 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
182 else return P6R::eNoInterface; \
183 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
186 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
187 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
188 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
190 #define P6_IMPLEMENT_ICOM6(classname,interface1,interface2,interface3,interface4,interface5,interface6) \
191 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
193 return P6R::eAccessFault; \
195 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
196 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
197 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
198 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
199 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
200 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
201 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
202 else return P6R::eNoInterface; \
203 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
206 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
207 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
208 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
210 #define P6_IMPLEMENT_ICOM7(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7) \
211 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
213 return P6R::eAccessFault; \
215 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
216 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
217 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
218 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
219 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
220 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
221 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
222 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
223 else return P6R::eNoInterface; \
224 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
227 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
228 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
229 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
231 #define P6_IMPLEMENT_ICOM8(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8) \
232 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
234 return P6R::eAccessFault; \
236 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
237 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
238 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
239 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
240 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
241 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
242 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
243 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
244 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
245 else return P6R::eNoInterface; \
246 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
249 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
250 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
251 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
253 #define P6_IMPLEMENT_ICOM9(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9) \
254 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
256 return P6R::eAccessFault; \
258 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
259 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
260 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
261 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
262 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
263 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
264 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
265 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
266 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
267 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
268 else return P6R::eNoInterface; \
269 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
272 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
273 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
274 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
276 #define P6_IMPLEMENT_ICOM10(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10) \
277 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
279 return P6R::eAccessFault; \
281 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
282 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
283 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
284 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
285 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
286 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
287 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
288 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
289 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
290 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
291 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
292 else return P6R::eNoInterface; \
293 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
296 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
297 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
298 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
300 #define P6_IMPLEMENT_ICOM11(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11) \
301 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
303 return P6R::eAccessFault; \
305 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
306 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
307 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
308 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
309 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
310 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
311 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
312 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
313 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
314 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
315 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
316 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
317 else return P6R::eNoInterface; \
318 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
321 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
322 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
323 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
325 #define P6_IMPLEMENT_ICOM12(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12) \
326 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
328 return P6R::eAccessFault; \
330 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
331 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
332 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
333 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
334 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
335 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
336 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
337 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
338 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
339 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
340 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
341 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
342 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
343 else return P6R::eNoInterface; \
344 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
347 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
348 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
349 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
351 #define P6_IMPLEMENT_ICOM13(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13) \
352 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
354 return P6R::eAccessFault; \
356 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
357 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
358 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
359 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
360 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
361 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
362 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
363 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
364 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
365 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
366 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
367 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
368 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
369 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
370 else return P6R::eNoInterface; \
371 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
374 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
375 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
376 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
378 #define P6_IMPLEMENT_ICOM14(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14) \
379 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
381 return P6R::eAccessFault; \
383 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
384 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
385 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
386 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
387 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
388 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
389 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
390 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
391 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
392 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
393 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
394 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
395 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
396 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
397 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
398 else return P6R::eNoInterface; \
399 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
402 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
403 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
404 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
406 #define P6_IMPLEMENT_ICOM15(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15) \
407 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
409 return P6R::eAccessFault; \
411 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
412 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
413 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
414 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
415 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
416 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
417 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
418 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
419 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
420 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
421 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
422 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
423 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
424 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
425 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
426 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
427 else return P6R::eNoInterface; \
428 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
431 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
432 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
433 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
435 #define P6_IMPLEMENT_ICOM16(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16) \
436 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
438 return P6R::eAccessFault; \
440 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
441 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
442 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
443 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
444 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
445 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
446 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
447 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
448 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
449 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
450 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
451 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
452 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
453 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
454 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
455 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
456 else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
457 else return P6R::eNoInterface; \
458 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
461 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
462 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
463 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
465 #define P6_IMPLEMENT_ICOM17(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16,interface17) \
466 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
468 return P6R::eAccessFault; \
470 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
471 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
472 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
473 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
474 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
475 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
476 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
477 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
478 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
479 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
480 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
481 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
482 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
483 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
484 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
485 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
486 else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
487 else if(iid == IID_##interface17) *ppv = static_cast<interface17*>(this); \
488 else return P6R::eNoInterface; \
489 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
492 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
493 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
494 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
517 #define P6_REFCOUNTED_CREATEINSTANCE(classname) \
518 static P6R::P6ERR createInstance(classname **ppNewComponent) \
521 classname *pObj = NULL; \
522 if(NULL == ppNewComponent) \
523 return P6R::eAccessFault; \
524 *ppNewComponent = NULL; \
525 if(NULL == (pObj = new classname())) { \
526 *ppNewComponent = NULL; \
527 return P6R::eNoMemory; \
530 if(1 == pObj->m_cRef.value) { \
531 (*ppNewComponent) = pObj; \
532 (*ppNewComponent)->addref(); \
536 err = P6R::eInvalidRefcount; \
554 #define P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
555 P6COMMETHOD_(P6R::P6INT32) addref() { \
556 P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); \
557 p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
573 #define P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
574 P6COMMETHOD_(P6R::P6INT32) release() { \
575 P6ASSERT(0 != m_cRef.value); \
576 P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef.value); \
577 p6TraceRelease(#classname,this,tmp,NULL); \
578 if(0 == tmp) { delete this; } \
610 #define P6_REFCOUNTED(classname) \
611 P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
612 P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
613 P6_REFCOUNTED_CREATEINSTANCE(classname) \
614 P6R::P6AUTO_INT32 m_cRef
618 #define P6REFCOUNTEDCLASS(classname) \
620 P6COMMETHOD_(P6R::P6INT32) addref() \
621 { P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); \
622 p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
624 P6COMMETHOD_(P6R::P6INT32) release() \
625 { P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef.value); \
626 p6TraceRelease(#classname,this,tmp,NULL); \
627 if(0 == tmp) { delete this; } \
629 P6R::P6AUTO_INT32 m_cRef
643 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA g_sComponentDataArray[] = {
645 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
648 (P6CREATEINST) (createInst), \
650 (const P6CATEGORYDATA*)(categories), \
654 #define P6END_COMPONENT_TABLE() }; \
655 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
660 #define P6BEGIN_CATAGORY_TABLE(table_name) static const P6CATEGORYDATA table_name[] = {
662 #define P6ADD_CATAGORY(catid,catagory_name) \
664 ((const P6R::CATID*)&(CATID_##catid)), \
668 #define P6END_CATAGORY_TABLE(table_name) }; \
669 static P6R::P6INT32 table_name##SZ = sizeof(table_name) / sizeof(P6CATEGORYDATA)
673 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd) \
674 static P6R::P6INT32 g_cActiveComponents = 0; \
675 extern "C" P6EXPORT P6R::P6ERR p6GetIModule(P6R::p6IModule **ppModule) \
677 return p6GlueGetIModule(&g_sComponentDataArray[0], \
678 g_cComponentDataEntries, \
679 &g_cActiveComponents, \
680 ppModule,(verInfo),(dllStart),(dllEnd)); \
689 #define P6TRACECTOR(c) p6TraceCTOR(#c,sizeof(*this),this,NULL)
690 #define P6TRACEDTOR() p6TraceDTOR("",this,NULL)
P6COM definitions and interfaces.