Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
p6comhlpr.h
Go to the documentation of this file.
1 
10 #ifndef P6COMHLPR_H__
11 #define P6COMHLPR_H__ 1
12 
13 #ifdef DOX_IGNORE
14 #include "p6com.h"
15 #endif
16 //#include "p6runtimeapi.h"
17 
18 //namespace P6R {
19 //
20 // template<typename I, const P6R::IID &iid>
21 // I* interface_cast(P6R::p6ICom *pIface)
22 // {
23 // P6ERR err = eOk;
24 // I* pNewIface= NULL;
25 //
26 // err = pIface->queryInterface(iid,(P6VOID**)*pNewIface);
27 // P6ASSERT(eOk == err);
28 // return pNewIface;
29 // }
30 //
31 //} // namespace
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
52 #define VALIDATEIF(type,ptr) IID_##type, reinterpret_cast<P6R::P6VOID**>(static_cast<type**>(ptr))
53 
54 
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
61 
62 
63 #define P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname) \
64 P6R::P6ERR classname::createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent) \
65 { \
66  P6R::P6ERR err; \
67  classname *pObj = NULL; \
68  if(NULL != pOuter) \
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; \
76  } \
77  pObj->addref(); \
78  if(1 == pObj->m_cRef.value) { \
79  err = pObj->queryInterface(iid,ppNewComponent); \
80  } \
81  else { \
82  err = eInvalidRefcount; \
83  } \
84  pObj->release(); \
85  return err; \
86 }
87 
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); \
92  return tmp; \
93 } \
94 
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; } \
101  return tmp; \
102 }
103 
104 #define P6_IMPLEMENT_ICOM1(classname,interface1) \
105 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) \
106 { \
107  if(!ppv) \
108  return P6R::eAccessFault; \
109  *ppv = NULL; \
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(); \
114  return P6R::eOk; \
115 } \
116 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
117 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
118 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
119 
120 #define P6_IMPLEMENT_ICOM2(classname,interface1,interface2) \
121 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
122  if(!ppv) \
123  return P6R::eAccessFault; \
124  *ppv = NULL; \
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(); \
130  return P6R::eOk; \
131 } \
132 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
133 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
134 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
135 
136 #define P6_IMPLEMENT_ICOM3(classname,interface1,interface2,interface3) \
137 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
138  if(!ppv) \
139  return P6R::eAccessFault; \
140  *ppv = NULL; \
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(); \
147  return P6R::eOk; \
148 } \
149 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
150 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
151 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
152 
153 #define P6_IMPLEMENT_ICOM4(classname,interface1,interface2,interface3,interface4) \
154 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
155  if(!ppv) \
156  return P6R::eAccessFault; \
157  *ppv = NULL; \
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(); \
165  return P6R::eOk; \
166 } \
167 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
168 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
169 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
170 
171 #define P6_IMPLEMENT_ICOM5(classname,interface1,interface2,interface3,interface4,interface5) \
172 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
173  if(!ppv) \
174  return P6R::eAccessFault; \
175  *ppv = NULL; \
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(); \
184  return P6R::eOk; \
185 } \
186 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
187 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
188 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
189 
190 #define P6_IMPLEMENT_ICOM6(classname,interface1,interface2,interface3,interface4,interface5,interface6) \
191 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
192  if(!ppv) \
193  return P6R::eAccessFault; \
194  *ppv = NULL; \
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(); \
204  return P6R::eOk; \
205 } \
206 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
207 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
208 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
209 
210 #define P6_IMPLEMENT_ICOM7(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7) \
211 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
212  if(!ppv) \
213  return P6R::eAccessFault; \
214  *ppv = NULL; \
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(); \
225  return P6R::eOk; \
226 } \
227 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
228 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
229 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
230 
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) { \
233  if(!ppv) \
234  return P6R::eAccessFault; \
235  *ppv = NULL; \
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(); \
247  return P6R::eOk; \
248 } \
249 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
250 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
251 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
252 
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) { \
255  if(!ppv) \
256  return P6R::eAccessFault; \
257  *ppv = NULL; \
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(); \
270  return P6R::eOk; \
271 } \
272 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
273 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
274 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
275 
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) { \
278  if(!ppv) \
279  return P6R::eAccessFault; \
280  *ppv = NULL; \
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(); \
294  return P6R::eOk; \
295 } \
296 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
297 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
298 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
299 
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) { \
302  if(!ppv) \
303  return P6R::eAccessFault; \
304  *ppv = NULL; \
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(); \
319  return P6R::eOk; \
320 } \
321 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
322 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
323 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
324 
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) { \
327  if(!ppv) \
328  return P6R::eAccessFault; \
329  *ppv = NULL; \
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(); \
345  return P6R::eOk; \
346 } \
347 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
348 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
349 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
350 
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) { \
353  if(!ppv) \
354  return P6R::eAccessFault; \
355  *ppv = NULL; \
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(); \
372  return P6R::eOk; \
373 } \
374 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
375 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
376 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
377 
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) { \
380  if(!ppv) \
381  return P6R::eAccessFault; \
382  *ppv = NULL; \
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(); \
400  return P6R::eOk; \
401 } \
402 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
403 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
404 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
405 
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) { \
408  if(!ppv) \
409  return P6R::eAccessFault; \
410  *ppv = NULL; \
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(); \
429  return P6R::eOk; \
430 } \
431 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
432 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
433 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
434 
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) { \
437  if(!ppv) \
438  return P6R::eAccessFault; \
439  *ppv = NULL; \
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(); \
459  return P6R::eOk; \
460 } \
461 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
462 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
463 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
464 
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) { \
467  if(!ppv) \
468  return P6R::eAccessFault; \
469  *ppv = NULL; \
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(); \
490  return P6R::eOk; \
491 } \
492 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
493 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
494 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
495 
517 #define P6_REFCOUNTED_CREATEINSTANCE(classname) \
518 static P6R::P6ERR createInstance(classname **ppNewComponent) \
519 { \
520  P6R::P6ERR err; \
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; \
528  } \
529  pObj->addref(); \
530  if(1 == pObj->m_cRef.value) { \
531  (*ppNewComponent) = pObj; \
532  (*ppNewComponent)->addref(); \
533  err = P6R::eOk; \
534  } \
535  else { \
536  err = P6R::eInvalidRefcount; \
537  } \
538  pObj->release(); \
539  return err; \
540 }
541 
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); \
558  return tmp; \
559 } \
560 
561 
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; } \
579  return tmp; \
580 }
581 
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
615 
616 
618 #define P6REFCOUNTEDCLASS(classname) \
619 public: \
620  P6COMMETHOD_(P6R::P6INT32) addref() \
621  { P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); \
622  p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
623  return tmp; } \
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; } \
628  return tmp; } \
629  P6R::P6AUTO_INT32 m_cRef
630 
631 
632 
633 
643 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA g_sComponentDataArray[] = {
644 
645 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
646  { \
647  &(cid), \
648  (P6CREATEINST) (createInst), \
649  (name), \
650  (const P6CATEGORYDATA*)(categories), \
651  (catcnt) \
652  }
653 
654 #define P6END_COMPONENT_TABLE() }; \
655 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
656 
657 
658 
659 
660 #define P6BEGIN_CATAGORY_TABLE(table_name) static const P6CATEGORYDATA table_name[] = {
661 
662 #define P6ADD_CATAGORY(catid,catagory_name) \
663  { \
664  ((const P6R::CATID*)&(CATID_##catid)), \
665  (catagory_name) \
666  }
667 
668 #define P6END_CATAGORY_TABLE(table_name) }; \
669 static P6R::P6INT32 table_name##SZ = sizeof(table_name) / sizeof(P6CATEGORYDATA)
670 
671 
672 
673 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd) \
674 static P6R::P6INT32 g_cActiveComponents = 0; \
675 extern "C" P6EXPORT P6R::P6ERR p6GetIModule(P6R::p6IModule **ppModule) \
676 { \
677  return p6GlueGetIModule(&g_sComponentDataArray[0], \
678  g_cComponentDataEntries, \
679  &g_cActiveComponents, \
680  ppModule,(verInfo),(dllStart),(dllEnd)); \
681 }
682 
683 
688 
689 #define P6TRACECTOR(c) p6TraceCTOR(#c,sizeof(*this),this,NULL)
690 #define P6TRACEDTOR() p6TraceDTOR("",this,NULL)
691 
695 #ifdef __cplusplus
696 }
697 #endif
698 
699 #endif
700 
P6COM definitions and interfaces.