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 #include <memory>
15 #ifdef DOX_IGNORE
16 #include "p6com.h"
17 #endif
18 //#include "p6runtimeapi.h"
19 
20 //namespace P6R {
21 //
22 // template<typename I, const P6R::IID &iid>
23 // I* interface_cast(P6R::p6ICom *pIface)
24 // {
25 // P6ERR err = eOk;
26 // I* pNewIface= NULL;
27 //
28 // err = pIface->queryInterface(iid,(P6VOID**)*pNewIface);
29 // P6ASSERT(eOk == err);
30 // return pNewIface;
31 // }
32 //
33 //} // namespace
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
54 #define VALIDATEIF(type,ptr) IID_##type, reinterpret_cast<P6R::P6VOID**>(static_cast<type**>(ptr))
55 
56 
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
63 
64 
65 #define P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname) \
66 P6R::P6ERR classname::createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent) \
67 { \
68  P6R::P6ERR err; \
69  classname *pObj = NULL; \
70  if(NULL != pOuter) \
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; \
78  } \
79  pObj->addref(); \
80  if(1 == pObj->m_cRef.value) { \
81  err = pObj->queryInterface(iid,ppNewComponent); \
82  } \
83  else { \
84  err = eInvalidRefcount; \
85  } \
86  pObj->release(); \
87  return err; \
88 }
89 
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); \
94  return tmp; \
95 } \
96 
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; } \
103  return tmp; \
104 }
105 
106 #define P6_IMPLEMENT_ICOM1(classname,interface1) \
107 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) \
108 { \
109  if(!ppv) \
110  return P6R::eAccessFault; \
111  *ppv = NULL; \
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(); \
116  return P6R::eOk; \
117 } \
118 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
119 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
120 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
121 
122 #define P6_IMPLEMENT_ICOM2(classname,interface1,interface2) \
123 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
124  if(!ppv) \
125  return P6R::eAccessFault; \
126  *ppv = NULL; \
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(); \
132  return P6R::eOk; \
133 } \
134 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
135 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
136 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
137 
138 #define P6_IMPLEMENT_ICOM3(classname,interface1,interface2,interface3) \
139 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
140  if(!ppv) \
141  return P6R::eAccessFault; \
142  *ppv = NULL; \
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(); \
149  return P6R::eOk; \
150 } \
151 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
152 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
153 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
154 
155 #define P6_IMPLEMENT_ICOM4(classname,interface1,interface2,interface3,interface4) \
156 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
157  if(!ppv) \
158  return P6R::eAccessFault; \
159  *ppv = NULL; \
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(); \
167  return P6R::eOk; \
168 } \
169 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
170 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
171 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
172 
173 #define P6_IMPLEMENT_ICOM5(classname,interface1,interface2,interface3,interface4,interface5) \
174 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
175  if(!ppv) \
176  return P6R::eAccessFault; \
177  *ppv = NULL; \
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(); \
186  return P6R::eOk; \
187 } \
188 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
189 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
190 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
191 
192 #define P6_IMPLEMENT_ICOM6(classname,interface1,interface2,interface3,interface4,interface5,interface6) \
193 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
194  if(!ppv) \
195  return P6R::eAccessFault; \
196  *ppv = NULL; \
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(); \
206  return P6R::eOk; \
207 } \
208 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
209 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
210 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
211 
212 #define P6_IMPLEMENT_ICOM7(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7) \
213 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
214  if(!ppv) \
215  return P6R::eAccessFault; \
216  *ppv = NULL; \
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(); \
227  return P6R::eOk; \
228 } \
229 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
230 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
231 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
232 
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) { \
235  if(!ppv) \
236  return P6R::eAccessFault; \
237  *ppv = NULL; \
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(); \
249  return P6R::eOk; \
250 } \
251 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
252 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
253 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
254 
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) { \
257  if(!ppv) \
258  return P6R::eAccessFault; \
259  *ppv = NULL; \
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(); \
272  return P6R::eOk; \
273 } \
274 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
275 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
276 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
277 
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) { \
280  if(!ppv) \
281  return P6R::eAccessFault; \
282  *ppv = NULL; \
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(); \
296  return P6R::eOk; \
297 } \
298 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
299 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
300 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
301 
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) { \
304  if(!ppv) \
305  return P6R::eAccessFault; \
306  *ppv = NULL; \
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(); \
321  return P6R::eOk; \
322 } \
323 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
324 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
325 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
326 
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) { \
329  if(!ppv) \
330  return P6R::eAccessFault; \
331  *ppv = NULL; \
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(); \
347  return P6R::eOk; \
348 } \
349 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
350 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
351 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
352 
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) { \
355  if(!ppv) \
356  return P6R::eAccessFault; \
357  *ppv = NULL; \
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(); \
374  return P6R::eOk; \
375 } \
376 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
377 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
378 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
379 
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) { \
382  if(!ppv) \
383  return P6R::eAccessFault; \
384  *ppv = NULL; \
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(); \
402  return P6R::eOk; \
403 } \
404 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
405 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
406 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
407 
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) { \
410  if(!ppv) \
411  return P6R::eAccessFault; \
412  *ppv = NULL; \
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(); \
431  return P6R::eOk; \
432 } \
433 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
434 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
435 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
436 
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) { \
439  if(!ppv) \
440  return P6R::eAccessFault; \
441  *ppv = NULL; \
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(); \
461  return P6R::eOk; \
462 } \
463 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
464 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
465 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
466 
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) { \
469  if(!ppv) \
470  return P6R::eAccessFault; \
471  *ppv = NULL; \
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(); \
492  return P6R::eOk; \
493 } \
494 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
495 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
496 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
497 
519 #define P6_REFCOUNTED_CREATEINSTANCE(classname) \
520 static P6R::P6ERR createInstance(classname **ppNewComponent) \
521 { \
522  P6R::P6ERR err; \
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; \
530  } \
531  pObj->addref(); \
532  if(1 == pObj->m_cRef.value) { \
533  (*ppNewComponent) = pObj; \
534  (*ppNewComponent)->addref(); \
535  err = P6R::eOk; \
536  } \
537  else { \
538  err = P6R::eInvalidRefcount; \
539  } \
540  pObj->release(); \
541  return err; \
542 }
543 
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); \
560  return tmp; \
561 } \
562 
563 
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; } \
581  return tmp; \
582 }
583 
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
617 
618 
620 #define P6REFCOUNTEDCLASS(classname) \
621 public: \
622  P6COMMETHOD_(P6R::P6INT32) addref() \
623  { P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); \
624  p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
625  return tmp; } \
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; } \
630  return tmp; } \
631  P6R::P6AUTO_INT32 m_cRef
632 
633 
634 
635 
645 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA g_sComponentDataArray[] = {
646 
647 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
648  { \
649  &(cid), \
650  (P6CREATEINST) (createInst), \
651  (name), \
652  (const P6CATEGORYDATA*)(categories), \
653  (catcnt) \
654  }
655 
656 #define P6END_COMPONENT_TABLE() }; \
657 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
658 
659 
660 
661 
662 #define P6BEGIN_CATAGORY_TABLE(table_name) static const P6CATEGORYDATA table_name[] = {
663 
664 #define P6ADD_CATAGORY(catid,catagory_name) \
665  { \
666  ((const P6R::CATID*)&(CATID_##catid)), \
667  (catagory_name) \
668  }
669 
670 #define P6END_CATAGORY_TABLE(table_name) }; \
671 static P6R::P6INT32 table_name##SZ = sizeof(table_name) / sizeof(P6CATEGORYDATA)
672 
673 
674 
675 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd) \
676 static P6R::P6INT32 g_cActiveComponents = 0; \
677 extern "C" P6EXPORT P6R::P6ERR p6GetIModule(P6R::p6IModule **ppModule) \
678 { \
679  return p6GlueGetIModule(&g_sComponentDataArray[0], \
680  g_cComponentDataEntries, \
681  &g_cActiveComponents, \
682  ppModule,(verInfo),(dllStart),(dllEnd)); \
683 }
684 
685 
690 
691 #define P6TRACECTOR(c) p6TraceCTOR(#c,sizeof(*this),this,NULL)
692 #define P6TRACEDTOR() p6TraceDTOR("",this,NULL)
693 
697 #ifdef __cplusplus
698 }
699 #endif
700 
701 #endif
702 
P6COM definitions and interfaces.