00001
00010 #ifndef P6COMHLPR_H__
00011 #define P6COMHLPR_H__ 1
00012
00013 #ifdef DOX_IGNORE
00014 #include "p6com.h"
00015 #endif
00016
00017 #ifdef __cplusplus
00018 extern "C" {
00019 #endif
00020
00030 #define VALIDATEIF(type,ptr) IID_##type, reinterpret_cast<P6R::P6VOID**>(static_cast<type**>(ptr))
00031
00032 #define P6_DECL_ICOM \
00033 P6COMMETHOD queryInterface(const P6R::IID &iid,P6R::P6VOID **ppIface);\
00034 P6COMMETHOD_(P6R::P6INT32) addref(); \
00035 P6COMMETHOD_(P6R::P6INT32) release(); \
00036 static P6R::P6ERR createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent); \
00037 P6R::P6INT32 m_cRef; \
00038 P6R::P6UINT32 m_p6SerialNumberp6;
00039
00040
00041 #define P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname) \
00042 P6R::P6ERR classname::createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent) \
00043 { \
00044 P6R::P6ERR err; \
00045 classname *pObj = NULL; \
00046 if(NULL != pOuter) \
00047 return P6R::eNoAgregation; \
00048 if(NULL == ppNewComponent) \
00049 return P6R::eAccessFault; \
00050 *ppNewComponent = NULL; \
00051 if(NULL == (pObj = new classname())) { \
00052 *ppNewComponent = NULL; \
00053 return P6R::eNoMemory; \
00054 } \
00055 pObj->addref(); \
00056 if(1 == pObj->m_cRef) { \
00057 err = pObj->queryInterface(iid,ppNewComponent); \
00058 } \
00059 else { \
00060 err = eInvalidRefcount; \
00061 } \
00062 pObj->release(); \
00063 return err; \
00064 }
00065
00066 #define P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00067 P6R::P6INT32 classname::addref() { \
00068 P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef); \
00069 p6TraceAddref(#classname,sizeof(*this),this,tmp,&m_p6SerialNumberp6); \
00070 return tmp; \
00071 } \
00072
00073 #define P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00074 P6R::P6INT32 classname::release() { \
00075 P6ASSERT(0 != m_cRef); \
00076 P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef); \
00077 p6TraceRelease(#classname,this,tmp,&m_p6SerialNumberp6); \
00078 if(0 == tmp) { delete this; } \
00079 return tmp; \
00080 }
00081
00082 #define P6_IMPLEMENT_ICOM1(classname,interface1) \
00083 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) \
00084 { \
00085 if(!ppv) \
00086 return P6R::eAccessFault; \
00087 *ppv = NULL; \
00088 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00089 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00090 else return P6R::eNoInterface; \
00091 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00092 return P6R::eOk; \
00093 } \
00094 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00095 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00096 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00097
00098 #define P6_IMPLEMENT_ICOM2(classname,interface1,interface2) \
00099 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00100 if(!ppv) \
00101 return P6R::eAccessFault; \
00102 *ppv = NULL; \
00103 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00104 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00105 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00106 else return P6R::eNoInterface; \
00107 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00108 return P6R::eOk; \
00109 } \
00110 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00111 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00112 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00113
00114 #define P6_IMPLEMENT_ICOM3(classname,interface1,interface2,interface3) \
00115 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00116 if(!ppv) \
00117 return P6R::eAccessFault; \
00118 *ppv = NULL; \
00119 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00120 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00121 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00122 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00123 else return P6R::eNoInterface; \
00124 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00125 return P6R::eOk; \
00126 } \
00127 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00128 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00129 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00130
00131 #define P6_IMPLEMENT_ICOM4(classname,interface1,interface2,interface3,interface4) \
00132 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00133 if(!ppv) \
00134 return P6R::eAccessFault; \
00135 *ppv = NULL; \
00136 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00137 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00138 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00139 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00140 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00141 else return P6R::eNoInterface; \
00142 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00143 return P6R::eOk; \
00144 } \
00145 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00146 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00147 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00148
00149 #define P6_IMPLEMENT_ICOM5(classname,interface1,interface2,interface3,interface4,interface5) \
00150 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00151 if(!ppv) \
00152 return P6R::eAccessFault; \
00153 *ppv = NULL; \
00154 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00155 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00156 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00157 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00158 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00159 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00160 else return P6R::eNoInterface; \
00161 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00162 return P6R::eOk; \
00163 } \
00164 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00165 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00166 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00167
00168 #define P6_IMPLEMENT_ICOM6(classname,interface1,interface2,interface3,interface4,interface5,interface6) \
00169 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00170 if(!ppv) \
00171 return P6R::eAccessFault; \
00172 *ppv = NULL; \
00173 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00174 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00175 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00176 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00177 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00178 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00179 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00180 else return P6R::eNoInterface; \
00181 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00182 return P6R::eOk; \
00183 } \
00184 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00185 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00186 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00187
00188 #define P6_IMPLEMENT_ICOM7(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7) \
00189 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00190 if(!ppv) \
00191 return P6R::eAccessFault; \
00192 *ppv = NULL; \
00193 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00194 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00195 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00196 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00197 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00198 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00199 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00200 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00201 else return P6R::eNoInterface; \
00202 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00203 return P6R::eOk; \
00204 } \
00205 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00206 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00207 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00208
00209 #define P6_IMPLEMENT_ICOM8(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8) \
00210 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00211 if(!ppv) \
00212 return P6R::eAccessFault; \
00213 *ppv = NULL; \
00214 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00215 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00216 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00217 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00218 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00219 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00220 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00221 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00222 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00223 else return P6R::eNoInterface; \
00224 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00225 return P6R::eOk; \
00226 } \
00227 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00228 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00229 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00230
00231 #define P6_IMPLEMENT_ICOM9(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9) \
00232 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00233 if(!ppv) \
00234 return P6R::eAccessFault; \
00235 *ppv = NULL; \
00236 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00237 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00238 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00239 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00240 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00241 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00242 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00243 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00244 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00245 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00246 else return P6R::eNoInterface; \
00247 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00248 return P6R::eOk; \
00249 } \
00250 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00251 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00252 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00253
00254 #define P6_IMPLEMENT_ICOM10(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10) \
00255 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00256 if(!ppv) \
00257 return P6R::eAccessFault; \
00258 *ppv = NULL; \
00259 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00260 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00261 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00262 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00263 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00264 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00265 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00266 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00267 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00268 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00269 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00270 else return P6R::eNoInterface; \
00271 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00272 return P6R::eOk; \
00273 } \
00274 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00275 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00276 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00277
00278 #define P6_IMPLEMENT_ICOM11(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11) \
00279 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00280 if(!ppv) \
00281 return P6R::eAccessFault; \
00282 *ppv = NULL; \
00283 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00284 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00285 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00286 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00287 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00288 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00289 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00290 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00291 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00292 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00293 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00294 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00295 else return P6R::eNoInterface; \
00296 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00297 return P6R::eOk; \
00298 } \
00299 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00300 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00301 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00302
00303 #define P6_IMPLEMENT_ICOM12(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12) \
00304 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00305 if(!ppv) \
00306 return P6R::eAccessFault; \
00307 *ppv = NULL; \
00308 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00309 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00310 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00311 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00312 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00313 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00314 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00315 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00316 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00317 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00318 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00319 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00320 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00321 else return P6R::eNoInterface; \
00322 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00323 return P6R::eOk; \
00324 } \
00325 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00326 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00327 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00328
00329 #define P6_IMPLEMENT_ICOM13(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13) \
00330 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00331 if(!ppv) \
00332 return P6R::eAccessFault; \
00333 *ppv = NULL; \
00334 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00335 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00336 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00337 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00338 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00339 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00340 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00341 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00342 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00343 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00344 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00345 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00346 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00347 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00348 else return P6R::eNoInterface; \
00349 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00350 return P6R::eOk; \
00351 } \
00352 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00353 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00354 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00355
00356 #define P6_IMPLEMENT_ICOM14(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14) \
00357 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00358 if(!ppv) \
00359 return P6R::eAccessFault; \
00360 *ppv = NULL; \
00361 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00362 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00363 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00364 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00365 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00366 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00367 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00368 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00369 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00370 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00371 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00372 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00373 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00374 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00375 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
00376 else return P6R::eNoInterface; \
00377 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00378 return P6R::eOk; \
00379 } \
00380 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00381 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00382 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00383
00384 #define P6_IMPLEMENT_ICOM15(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15) \
00385 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00386 if(!ppv) \
00387 return P6R::eAccessFault; \
00388 *ppv = NULL; \
00389 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00390 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00391 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00392 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00393 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00394 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00395 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00396 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00397 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00398 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00399 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00400 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00401 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00402 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00403 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
00404 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
00405 else return P6R::eNoInterface; \
00406 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00407 return P6R::eOk; \
00408 } \
00409 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00410 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00411 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00412
00413 #define P6_IMPLEMENT_ICOM16(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16) \
00414 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00415 if(!ppv) \
00416 return P6R::eAccessFault; \
00417 *ppv = NULL; \
00418 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00419 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00420 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00421 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00422 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00423 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00424 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00425 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00426 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00427 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00428 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00429 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00430 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00431 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00432 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
00433 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
00434 else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
00435 else return P6R::eNoInterface; \
00436 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00437 return P6R::eOk; \
00438 } \
00439 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00440 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00441 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00442
00443 #define P6_IMPLEMENT_ICOM17(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16,interface17) \
00444 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) { \
00445 if(!ppv) \
00446 return P6R::eAccessFault; \
00447 *ppv = NULL; \
00448 if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
00449 else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00450 else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00451 else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00452 else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00453 else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00454 else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00455 else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00456 else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00457 else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00458 else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00459 else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00460 else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00461 else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00462 else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
00463 else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
00464 else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
00465 else if(iid == IID_##interface17) *ppv = static_cast<interface17*>(this); \
00466 else return P6R::eNoInterface; \
00467 reinterpret_cast<p6ICom*>(*ppv)->addref(); \
00468 return P6R::eOk; \
00469 } \
00470 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
00471 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
00472 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00473
00474
00475 #define P6REFCOUNTEDCLASS \
00476 public: \
00477 P6COMMETHOD_(P6R::P6INT32) addref() \
00478 { P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); return tmp; } \
00479 P6COMMETHOD_(P6R::P6INT32) release() \
00480 { P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef.value); if(0 == tmp) { delete this; } return tmp; } \
00481 protected: \
00482 P6R::P6AUTO_INT32 m_cRef; \
00483 P6R::P6UINT32 m_p6SerialNumberp6; \
00484 public:
00485
00486
00490 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA g_sComponentDataArray[] = {
00491
00492 #define P6END_COMPONENT_TABLE() }; \
00493 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
00494
00495 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd) \
00496 static P6R::P6INT32 g_cActiveComponents = 0; \
00497 extern "C" P6EXPORT P6R::P6ERR p6GetIModule(P6R::p6IModule **ppModule) \
00498 { \
00499 return p6GlueGetIModule(&g_sComponentDataArray[0], \
00500 g_cComponentDataEntries, \
00501 &g_cActiveComponents, \
00502 ppModule,(verInfo),(dllStart),(dllEnd)); \
00503 }
00504
00505 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
00506 { \
00507 &(cid), \
00508 (P6CREATEINST) (createInst), \
00509 (name), \
00510 (categories), \
00511 (catcnt) \
00512 }
00513
00518
00519
00520 #define P6ENABLECLASSTRACE P6R::P6UINT32 m_p6SerialNumberp6
00521 #define P6TRACECTOR(c) p6TraceCTOR(#c,sizeof(*this),this,&m_p6SerialNumberp6)
00522 #define P6TRACEDTOR(c) p6TraceDTOR(#c,this,&m_p6SerialNumberp6)
00523
00527 #ifdef __cplusplus
00528 }
00529 #endif
00530
00531 #endif
00532