hxcom.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:24k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _HXCOM_H_
  36. #define _HXCOM_H_
  37. #include "hxtypes.h" /* Needed for most type definitions */
  38. // have to use the double expansion to get the prescan level
  39. #define STATCONCAT1(w,x,y,z) STATCONCAT2(w,x,y,z)
  40. #define STATCONCAT2(w,x,y,z) w##x##y##z  
  41. #ifdef _STATICALLY_LINKED
  42. #ifndef _PLUGINNAME
  43. #define ENTRYPOINT(func) STATCONCAT1(entrypoint_error_symbol_should_not_be_needed,_PLUGINNAME,_,func)
  44. #else /* _PLUGINNAME */
  45. #define ENTRYPOINT(func) STATCONCAT1(entrypoint_for_,_PLUGINNAME,_,func)
  46. #endif
  47. #else /* _STATICALLY_LINKED */
  48. #define ENTRYPOINT(func) func
  49. #endif
  50. /*
  51.  * We include objbase.h when building for windows so that hxcom.h can 
  52.  * easily be used in any windows code.
  53.  */
  54. #ifdef _WIN32
  55. #include <objbase.h>
  56. #endif /* _WIN32 */
  57. #include "hxresult.h"
  58. /*
  59.  *  REF:
  60.  * Use this for reference parameters, so that C users can 
  61.  * use the interface as well.
  62.  */
  63. #if defined(__cplusplus)
  64. #define REF(type)   type&
  65. #else
  66. #define REF(type) const type * const
  67. #endif
  68. /*
  69.  *  CONSTMETHOD:
  70.  * Use this for constant methods in an interface 
  71.  * Compiles away under C
  72.  */
  73. #if !defined( CONSTMETHOD )
  74. #if defined(__cplusplus)
  75. #define CONSTMETHOD const
  76. #else
  77. #define CONSTMETHOD
  78. #endif
  79. #endif
  80. /*
  81.  *  CALL:
  82.  *
  83.  * Used by C users to easily call a function through an interface
  84.  *
  85.  *  EXAMPLE:
  86.  *
  87.  * pIFooObject->CALL(IFoo,DoSomething)(bar);
  88.  *
  89.  */
  90. #if !defined(__cplusplus) || defined(CINTERFACE)
  91. #define CALL(iface, func) iface##Vtbl->func
  92. #endif
  93. #define _INTERFACE struct
  94. /*
  95.  * If using windows.h or the windows implementation of COM
  96.  * these defines are not needed.
  97.  */
  98. #if !defined( _OBJBASE_H_ ) 
  99. #ifdef _WIN16
  100. typedef unsigned int MMRESULT;
  101. #define FAR             _far
  102. #else
  103. #define FAR             
  104. #endif /* WIN16 */
  105. #define PASCAL          _pascal
  106. #define CDECL           _cdecl
  107. /*
  108.  * EXTERN_C
  109.  */
  110. #ifndef EXTERN_C
  111. #ifdef __cplusplus
  112. #define EXTERN_C    extern "C"
  113. #else
  114. #define EXTERN_C    extern
  115. #endif
  116. #endif
  117. #ifdef OLDERRORCODES
  118. #ifndef MAKE_HRESULT
  119. #define MAKE_HRESULT(sev,fac,code) ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))))
  120. #endif /*MAKE_HRESULT*/
  121. #endif /* OLDERRORCODES */
  122. /*
  123.  *  STDMETHODCALLTYPE
  124.  */
  125. #ifndef STDMETHODCALLTYPE
  126. #if defined(_WIN32) || defined(_MPPC_)
  127. #ifdef _MPPC_
  128. #define STDMETHODCALLTYPE       __cdecl
  129. #else
  130. #define STDMETHODCALLTYPE       __stdcall
  131. #endif
  132. #elif defined(_WIN16)
  133. #define STDMETHODCALLTYPE       __export FAR CDECL
  134. #else
  135. #define STDMETHODCALLTYPE
  136. #endif
  137. #endif
  138. /*
  139.  *  STDMETHODVCALLTYPE
  140.  */
  141. #ifndef STDMETHODVCALLTYPE
  142. #if defined(_WINDOWS) || defined(_MPPC_)
  143. #define STDMETHODVCALLTYPE      __cdecl
  144. #else
  145. #define STDMETHODVCALLTYPE
  146. #endif
  147. #endif
  148. /*
  149.  *  STDAPICALLTYPE
  150.  */
  151. #ifndef STDAPICALLTYPE
  152. #if defined(_WIN32) || defined(_MPPC_)
  153. #define STDAPICALLTYPE          __stdcall
  154. #elif defined(_WIN16)
  155. #define STDAPICALLTYPE          __export FAR PASCAL
  156. #else
  157. #define STDAPICALLTYPE
  158. #endif
  159. #endif
  160. /*
  161.  *  STDAPIVCALLTYPE
  162.  */
  163. #ifndef STDAPIVCALLTYPE
  164. #if defined(_WINDOWS) || defined(_MPPC_)
  165. #define STDAPIVCALLTYPE         __cdecl
  166. #else
  167. #define STDAPIVCALLTYPE
  168. #endif
  169. #endif
  170. /*
  171.  *  Standard API defines:
  172.  *
  173.  * NOTE: the 'V' versions allow Variable Argument lists.
  174.  *
  175.  * STDAPI
  176.  * STDAPI_(type)
  177.  * STDAPIV
  178.  * STDAPIV_(type)
  179.  */
  180. #ifndef STDAPI
  181. #define STDAPI                  EXTERN_C HX_RESULT STDAPICALLTYPE
  182. #endif
  183. #ifndef STDAPI_
  184. #define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
  185. #endif
  186. #ifndef STDAPIV
  187. #define STDAPIV                 EXTERN_C HX_RESULT STDAPIVCALLTYPE
  188. #endif
  189. #ifndef STDAPIV_
  190. #define STDAPIV_(type)          EXTERN_C type STDAPIVCALLTYPE
  191. #endif
  192. /*
  193.  *  Standard Interface Method defines:
  194.  *
  195.  * NOTE: the 'V' versions allow Variable Argument lists.
  196.  *
  197.  * STDMETHODIMP
  198.  * STDMETHODIMP_(type)
  199.  * STDMETHODIMPV
  200.  * STDMETHODIMPV_(type)
  201.  */
  202. #ifndef STDMETHODIMP
  203. #define STDMETHODIMP            HX_RESULT STDMETHODCALLTYPE
  204. #endif
  205. #ifndef STDMETHODIMP_
  206. #define STDMETHODIMP_(type)     type STDMETHODCALLTYPE
  207. #endif
  208. #ifndef STDMETHODIMPV
  209. #define STDMETHODIMPV           HX_RESULT STDMETHODVCALLTYPE
  210. #endif
  211. #ifndef STDMETHODIMPV_
  212. #define STDMETHODIMPV_(type)    type STDMETHODVCALLTYPE
  213. #endif
  214. #if defined(__cplusplus) && !defined(CINTERFACE)
  215. #define _INTERFACE struct
  216. #define STDMETHOD(method)       virtual HX_RESULT STDMETHODCALLTYPE method
  217. #define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
  218. #define PURE                    = 0
  219. #define THIS_
  220. #define THIS                    void
  221. #if defined(_WINDOWS) && defined(EXPORT_CLASSES)
  222. #define DECLARE_INTERFACE(iface)    _INTERFACE HXEXPORT_CLASS iface
  223. #define DECLARE_INTERFACE_(iface, baseiface)    _INTERFACE HXEXPORT_CLASS iface : public baseiface
  224. #else
  225. #define DECLARE_INTERFACE(iface)    _INTERFACE iface
  226. #define DECLARE_INTERFACE_(iface, baseiface)    _INTERFACE iface : public baseiface
  227. #endif // defined(_WINDOWS) && defined(EXPORT_CLASSES)
  228. #if !defined(BEGIN_INTERFACE)
  229. #if defined(_MPPC_)  && 
  230.     ( (defined(_MSC_VER) || defined(__SC__) || defined(__MWERKS__)) && 
  231.     !defined(NO_NULL_VTABLE_ENTRY) )
  232.    #define BEGIN_INTERFACE virtual void a() {}
  233.    #define END_INTERFACE
  234. #else
  235.    #define BEGIN_INTERFACE
  236.    #define END_INTERFACE
  237. #endif
  238. #endif
  239. #else
  240. #define _INTERFACE               struct
  241. #define STDMETHOD(method)       HX_RESULT (STDMETHODCALLTYPE * method)
  242. #define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)
  243. #if !defined(BEGIN_INTERFACE)
  244. #if defined(_MPPC_)
  245.     #define BEGIN_INTERFACE       void    *b;
  246.     #define END_INTERFACE
  247. #else
  248.     #define BEGIN_INTERFACE
  249.     #define END_INTERFACE
  250. #endif
  251. #endif
  252. #define PURE
  253. #define THIS_                   INTERFACE FAR* This,
  254. #define THIS                    INTERFACE FAR* This
  255. #ifdef CONST_VTABLE
  256. #undef CONST_VTBL
  257. #define CONST_VTBL const
  258. #define DECLARE_INTERFACE(iface)    typedef _INTERFACE iface { 
  259.                                     const struct iface##Vtbl FAR* lpVtbl; 
  260.                                 } iface; 
  261.                                 typedef const struct iface##Vtbl iface##Vtbl; 
  262.                                 const struct iface##Vtbl
  263. #else
  264. #undef CONST_VTBL
  265. #define CONST_VTBL
  266. #define DECLARE_INTERFACE(iface)    typedef _INTERFACE iface { 
  267.                                     struct iface##Vtbl FAR* lpVtbl; 
  268.                                 } iface; 
  269.                                 typedef struct iface##Vtbl iface##Vtbl; 
  270.                                 struct iface##Vtbl
  271. #endif
  272. #define DECLARE_INTERFACE_(iface, baseiface)    DECLARE_INTERFACE(iface)
  273. #endif
  274. /*
  275.  *  COMMON TYPES
  276.  */
  277. #if !defined(HELIX_FEATURE_FULLGUID)
  278. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
  279. #define DEFINE_GUID_ENUM(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  280.     name = l + w1 * 3 + w2 * 5 + b1 * 7 + b2 * 11 + b3 * 13 + b4 * 17 +   
  281.            b5 * 19 + b6 * 23 + b7 * 29 + b8 * 31,
  282. #ifndef GUID_DEFINED
  283. #define GUID_DEFINED
  284. typedef enum _GUIDNoConflict
  285. {
  286.     GUID_NULL,
  287.     DEFINE_GUID_ENUM(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xC0,
  288.                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46)
  289.     DEFINE_GUID_ENUM(IID_IMalloc,  0x00000002, 0x0000, 0x0000, 0xC0,
  290.                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46)
  291. #include "hxiids.h"
  292. #include "hxpiids.h"
  293.     NUM_GUIDS
  294. } GUID;
  295. #endif
  296. #else /* #if !defined(HELIX_FEATURE_FULLGUID) */
  297. #ifndef GUID_DEFINED
  298. #define GUID_DEFINED
  299. typedef struct  _GUID
  300.     {
  301.     ULONG32 Data1;
  302.     UINT16 Data2;
  303.     UINT16 Data3;
  304.     UCHAR Data4[ 8 ];
  305.     } GUID;
  306. #endif
  307. #endif /* #if !defined(HELIX_FEATURE_FULLGUID) #else */
  308. #if !defined( __IID_DEFINED__ )
  309. #define __IID_DEFINED__
  310. typedef GUID IID;
  311. #define IID_NULL            GUID_NULL
  312. typedef GUID CLSID;
  313. #define CLSID_NULL          GUID_NULL
  314. #if defined(__cplusplus)
  315. #ifndef _REFGUID_DEFINED
  316. #define _REFGUID_DEFINED
  317. #define REFGUID             const GUID &
  318. #endif
  319. #ifndef _REFIID_DEFINED
  320. #define _REFIID_DEFINED
  321. #define REFIID              const IID &
  322. #endif
  323. #ifndef _REFCLSID_DEFINED
  324. #define _REFCLSID_DEFINED
  325. #define REFCLSID            const CLSID &
  326. #endif
  327. #else
  328. #ifndef _REFGUID_DEFINED
  329. #define _REFGUID_DEFINED
  330. #define REFGUID             const GUID * const
  331. #endif
  332. #ifndef _REFIID_DEFINED
  333. #define _REFIID_DEFINED
  334. #define REFIID              const IID * const
  335. #endif
  336. #ifndef _REFCLSID_DEFINED
  337. #define _REFCLSID_DEFINED
  338. #define REFCLSID            const CLSID * const
  339. #endif
  340. #endif
  341. #endif
  342. #if defined(HELIX_FEATURE_FULLGUID)
  343. #if !defined (INITGUID) || (defined (_STATICALLY_LINKED) && !defined(NCIHACK))
  344. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  345.     EXTERN_C const GUID FAR name
  346. #define DEFINE_GUID_ENUM(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  347.     EXTERN_C const GUID FAR name;
  348. #else /* #if !defined (INITGUID) || (defined (_STATICALLY_LINKED) && !defined(NCIHACK)) */
  349. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  350.         EXTERN_C const GUID name 
  351.                 = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
  352. #define DEFINE_GUID_ENUM(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  353.         EXTERN_C const GUID name 
  354.                 = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } };
  355. #endif /* #if !defined (INITGUID) || (defined (_STATICALLY_LINKED) && !defined(NCIHACK)) #else */
  356. #endif /* #if defined(HELIX_FEATURE_FULLGUID) */
  357. /* memcmp is in string.h on symbian and MacOSX (or Darwin). */
  358. #if defined(_OPENWAVE) || defined(_MACINTOSH)
  359. #include "hlxclib/string.h"
  360. #elif !defined(_VXWORKS) && !defined(_SYMBIAN) && !defined(_MAC_MACHO)
  361. #include "hlxclib/memory.h" /* for memcmp */
  362. #endif
  363. #ifdef __cplusplus
  364. inline BOOL IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
  365. {
  366. #if defined(HELIX_FEATURE_FULLGUID)
  367.    return !memcmp(&rguid1, &rguid2, sizeof(GUID));
  368. #else // HELIX_FEATURE_FULLGUID
  369.    return (rguid1 == rguid2);
  370. #endif // HELIX_FEATURE_FULLGUID
  371.     
  372. }
  373. inline void SetGUID(GUID& rguid1, REFGUID rguid2)
  374. {
  375. #if defined(HELIX_FEATURE_FULLGUID)
  376.     memcpy(&rguid1, &rguid2, sizeof(GUID)); /* Flawfinder: ignore */
  377. #else // HELIX_FEATURE_FULLGUID
  378.     rguid1 = rguid2;
  379. #endif // HELIX_FEATURE_FULLGUID
  380. }
  381. #else // __cplusplus
  382. #if defined(HELIX_FEATURE_FULLGUID)
  383. #define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
  384. #define SetGUID(rguid1, rguid2) (memcpy(rguid1, rguid2, sizeof(GUID))) /* Flawfinder: ignore */
  385. #else // HELIX_FEATURE_FULLGUID
  386. #define IsEqualGUID(rguid1, rguid2) ((rguid1) == (rguid2))
  387. #define SetGUID(rguid1, rguid2) ((rguid1) = (rguid2))
  388. #endif // HELIX_FEATURE_FULLGUID
  389. #endif // __cplusplus
  390. #define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
  391. #define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
  392. #define SetIID(riid1, riid2)     SetGUID(riid1, riid2)
  393. #define SetCLSID(rclsid1, rclsid2)  SetGUID(rclsid1, rclsid2)
  394. #ifdef __cplusplus
  395. /*
  396.  * Because GUID is defined elsewhere in WIN32 land, the operator == and !=
  397.  * are moved outside the class to global scope.
  398.  */
  399. #if defined(HELIX_FEATURE_FULLGUID)
  400. inline BOOL operator==(const GUID& guidOne, const GUID& guidOther)
  401. {
  402.     return !memcmp(&guidOne,&guidOther,sizeof(GUID));
  403. }
  404. inline BOOL operator!=(const GUID& guidOne, const GUID& guidOther)
  405. {
  406.     return !(guidOne == guidOther);
  407. }
  408. #endif // HELIX_FEATURE_FULLGUID
  409. #endif
  410. /****************************************************************************
  411.  * 
  412.  *  Interface:
  413.  *
  414.  * IUnknown
  415.  *
  416.  *  Purpose:
  417.  *
  418.  * Base class of all interfaces. Defines life time management and
  419.  * support for dynamic cast.
  420.  *
  421.  *  IID_IUnknown:
  422.  *
  423.  * {00000000-0000-0000-C000000000000046}
  424.  *
  425.  */
  426. DEFINE_GUID(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 
  427. 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
  428. #undef  INTERFACE
  429. #define INTERFACE   IUnknown
  430. DECLARE_INTERFACE(IUnknown)
  431. {
  432.     STDMETHOD(QueryInterface) (THIS_
  433. REFIID riid,
  434. void** ppvObj) PURE;
  435.     STDMETHOD_(ULONG32,AddRef) (THIS) PURE;
  436.     STDMETHOD_(ULONG32,Release) (THIS) PURE;
  437. };
  438. /****************************************************************************
  439.  * 
  440.  *  Interface:
  441.  *
  442.  * IMalloc
  443.  *
  444.  *  Purpose:
  445.  *
  446.  * Basic memory management interface.
  447.  *
  448.  *  IID_IMalloc:
  449.  *
  450.  * {00000002-0000-0000-C000000000000046}
  451.  *
  452.  */
  453. DEFINE_GUID(IID_IMalloc, 00000002, 0x0000, 0x0000, 0xC0, 0x00, 
  454. 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
  455. #undef  INTERFACE
  456. #define INTERFACE   IMalloc
  457. DECLARE_INTERFACE_(IMalloc, IUnknown)
  458. {
  459.     /*
  460.      * IUnknown methods
  461.      */
  462.     STDMETHOD(QueryInterface) (THIS_
  463. REFIID riid,
  464. void** ppvObj) PURE;
  465.     STDMETHOD_(ULONG32,AddRef) (THIS) PURE;
  466.     STDMETHOD_(ULONG32,Release) (THIS) PURE;
  467.     /*
  468.      * IMalloc methods
  469.      */
  470.     STDMETHOD_(void*,Alloc)     (THIS_
  471.     UINT32  /*IN*/ count) PURE;
  472.     STDMETHOD_(void*,Realloc)     (THIS_
  473.     void*   /*IN*/ pMem,
  474.     UINT32  /*IN*/ count) PURE;
  475.     STDMETHOD_(void,Free)     (THIS_
  476.     void*   /*IN*/ pMem) PURE;
  477.     STDMETHOD_(UINT32,GetSize)     (THIS_
  478.     void*   /*IN*/ pMem) PURE;
  479.     STDMETHOD_(BOOL,DidAlloc)     (THIS_
  480.     void*   /*IN*/ pMem) PURE;
  481.     STDMETHOD_(void,HeapMinimize)   (THIS) PURE;
  482. };
  483. #else /* else case of !defined( _OBJBASE_H_ ) && !defined( _COMPOBJ_H_ ) */
  484. // For now, we always use full guids on Windows
  485. #ifndef HELIX_FEATURE_FULLGUID
  486. #define HELIX_FEATURE_FULLGUID
  487. #endif /* HELIX_FEATURE_FULLGUID */
  488. #ifdef DEFINE_GUID
  489. #undef DEFINE_GUID
  490. #endif
  491. #if !defined (INITGUID) || (defined (_STATICALLY_LINKED) && !defined(NCIHACK))
  492. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  493.     EXTERN_C const GUID FAR name
  494. #define DEFINE_GUID_ENUM(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  495.     EXTERN_C const GUID FAR name;
  496. #else
  497. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  498.         EXTERN_C const GUID name 
  499.                 = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
  500. #define DEFINE_GUID_ENUM(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  501.         EXTERN_C const GUID name 
  502.                 = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } };
  503. #endif
  504. /* Even in windows we want these GUID's defined... */
  505. #if !(defined(INITGUID) && defined(USE_IUNKNOWN_AND_IMALLOC_FROM_UUID_LIB))
  506. DEFINE_GUID(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 
  507. 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
  508. DEFINE_GUID(IID_IMalloc, 00000002, 0x0000, 0x0000, 0xC0, 0x00, 
  509. 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
  510. #endif
  511. #include <memory.h> /* for memcmp */
  512. #ifdef __cplusplus
  513. inline void SetGUID(REFGUID rguid1, REFGUID rguid2)
  514. {
  515.     memcpy((void*)&rguid1, (void*)&rguid2, sizeof(GUID)); /* Flawfinder: ignore */
  516. }
  517. #else
  518. #define SetGUID(rguid1, rguid2) (memcpy((void*)rguid1, (void*)rguid2, sizeof(GUID))) /* Flawfinder: ignore */
  519. #endif
  520. #define SetIID(riid1, riid2)     SetGUID(riid1, riid2)
  521. #define SetCLSID(rclsid1, rclsid2)  SetGUID(rclsid1, rclsid2)
  522. #endif /* !defined( _OBJBASE_H_ ) && !defined( _COMPOBJ_H_ )*/
  523. #ifdef __cplusplus
  524. /*
  525.  * This operator is defined for all platforms
  526.  */
  527. #if defined(HELIX_FEATURE_FULLGUID)
  528. inline BOOL operator<(const GUID& lhs, const GUID& rhs)
  529. {
  530.     return memcmp(&lhs, &rhs, sizeof(GUID)) < 0;
  531. }
  532. #endif // HELIX_FEATURE_FULLGUID
  533. #endif // __cplusplus
  534. #ifdef IsEqualIID
  535. #undef IsEqualIID
  536. #endif
  537. #ifdef IsEqualCLSID
  538. #undef IsEqualCLSID
  539. #endif
  540. #define IsEqualIID(riid1, riid2) HXIsEqualGUID(riid1, riid2)
  541. #define IsEqualCLSID(rclsid1, rclsid2) HXIsEqualGUID(rclsid1, rclsid2)
  542. #ifdef __cplusplus
  543. inline BOOL HXIsEqualGUID(REFGUID rguid1, REFGUID rguid2)
  544. {
  545. #if defined(HELIX_FEATURE_FULLGUID)
  546.    return (((UINT32*) &rguid1)[0] == ((UINT32*) &rguid2)[0]  &&
  547.     ((UINT32*) &rguid1)[1] == ((UINT32*) &rguid2)[1] &&
  548.     ((UINT32*) &rguid1)[2] == ((UINT32*) &rguid2)[2] &&
  549.     ((UINT32*) &rguid1)[3] == ((UINT32*) &rguid2)[3]);
  550. #else
  551.    return( (rguid1) == (rguid2) );
  552. #endif
  553. }
  554. #else
  555. #if defined(HELIX_FEATURE_FULLGUID)
  556. #define HXIsEqualGUID(rguid1, rguid2)
  557. (((UINT32*) &rguid1)[0] == ((UINT32*) &rguid2)[0]  &&   
  558.     ((UINT32*) &rguid1)[1] == ((UINT32*) &rguid2)[1] && 
  559.     ((UINT32*) &rguid1)[2] == ((UINT32*) &rguid2)[2] && 
  560.     ((UINT32*) &rguid1)[3] == ((UINT32*) &rguid2)[3]);
  561. #else
  562. #define HXIsEqualGUID(rguid1, rguid2)
  563.    ( (rguid1) == (rguid2) );
  564. #endif
  565. #endif
  566. /****************************************************************************
  567.  *
  568.  *  QueryInterface size reduction structs and functions.
  569.  *
  570.  *  Example Usage:
  571.  *
  572.  *  QInterfaceList qiList[] =
  573.  *   {
  574.  * { GET_IIDHANDLE(IID_IUnknown), (IUnknown*) (IHXPlugin*) this},
  575.  * { GET_IIDHANDLE(IID_IHXPlugin), (IHXPlugin*) this},
  576.  * { GET_IIDHANDLE(IID_IHXFileFormatObject), (IHXFileFormatObject*) this},
  577.  * { GET_IIDHANDLE(IID_IHXAtomizerResponse), (IHXAtomizerResponse*) this},
  578.  * { GET_IIDHANDLE(IID_IHXAtomizationCommander), (IHXAtomizationCommander*) this},
  579.  * { GET_IIDHANDLE(IID_IHXASMSource), (IHXASMSource*) this},
  580.  * { GET_IIDHANDLE(IID_IHXPacketFormat), (IHXPacketFormat*) this},
  581.  * { GET_IIDHANDLE(IID_IHXFileSwitcher), (IHXFileSwitcher*) m_pFileSwitcher},
  582.  * { GET_IIDHANDLE(IID_IHXCommonClassFactory), m_pClassFactory},
  583.  * { GET_IIDHANDLE(IID_IHXScheduler), m_pScheduler}
  584.  *   };
  585.  *
  586.  *   return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  587.  */
  588. #if !defined(HELIX_FEATURE_FULLGUID)
  589. #define IIDHANDLE     IID
  590. #define GET_IIDHANDLE(x)    (x)
  591. #define DREF_IIDHANDLE(x)   (x)
  592. #else // HELIX_FEATURE_FULLGUID
  593. #define IIDHANDLE     const IID*
  594. #define GET_IIDHANDLE(x)    (&(x))
  595. #define DREF_IIDHANDLE(x)   (*(x))
  596. #endif // HELIX_FEATURE_FULLGUID
  597. typedef struct
  598. {
  599.     IIDHANDLE hiid;
  600.     void* pIFace;
  601. } QInterfaceList;
  602. #define QILISTSIZE(x) sizeof(x)/sizeof(QInterfaceList)
  603. #if !defined(INITGUID) || (defined(_STATICALLY_LINKED) && !defined(NCIHACK))
  604. EXTERN_C HX_RESULT QIFind(QInterfaceList* qiList, UINT32 ulqiListSize, 
  605.   REFIID riid, void** ppvObj);
  606. #else // !INITGUID || (_STATICALLY_LINKED && NCIHACK)
  607. EXTERN_C HX_RESULT QIFind(QInterfaceList* qiList, UINT32 ulqiListSize, 
  608.   REFIID riid, void** ppvObj)
  609. {
  610.     do
  611.     {
  612. if (IsEqualIID(DREF_IIDHANDLE(qiList->hiid), riid))
  613. {
  614.     *ppvObj = (qiList->pIFace);
  615.     if (*ppvObj)
  616.     {
  617. ((IUnknown*) (*ppvObj))->AddRef();
  618. return HXR_OK;
  619.     }
  620.     return HXR_NOINTERFACE;
  621. }
  622. qiList++;
  623.     } while ((--ulqiListSize) != 0);
  624.     *ppvObj = NULL;
  625.     return HXR_NOINTERFACE;
  626. }
  627. #endif // !INITGUID || (_STATICALLY_LINKED && NCIHACK)
  628. /****************************************************************************
  629.  *
  630.  *  Putting the following macro in the definition of your class will overload
  631.  *  new and delete for that object.  New will then take an IMalloc* from
  632.  *  which to allocate memory from and store it in the begining of the
  633.  *  memory which it will return.  Delete will grab this IMalloc* from
  634.  *  the beginning of the mem and use this pointer to deallocate the mem.
  635.  *
  636.  *  Example useage:
  637.  *  class A
  638.  *  {
  639.  *  public:
  640.  *      A(int);
  641.  *      ~A();
  642.  *
  643.  *      IMALLOC_MEM
  644.  *  };
  645.  *
  646.  *  IMalloc* pMalloc;
  647.  *  m_pContext->QueryInterface(IID_IMalloc, (void**)&pMalloc);
  648.  *  A* p = new(pMalloc) A(0);
  649.  *  pMalloc->Release();
  650.  *  delete p;
  651.  */
  652. #define IMALLOC_MEM
  653.     void* operator new(size_t size, IMalloc* pMalloc)
  654.     {
  655.         void* pMem = pMalloc->Alloc(size + sizeof(IMalloc*));
  656.         *(IMalloc**)pMem = pMalloc;
  657.         pMalloc->AddRef();
  658.         return ((unsigned char*)pMem + sizeof(IMalloc*));
  659.     }
  660.     void operator delete(void* pMem)
  661.     {
  662.         pMem = (unsigned char*)pMem - sizeof(IMalloc*);
  663.         IMalloc* pMalloc = *(IMalloc**)pMem;
  664.         pMalloc->Free(pMem);
  665.         pMalloc->Release();
  666.     }
  667. /****************************************************************************
  668.  *
  669.  * By default, we attempt to use atomic InterlockedIncrement/Decrement
  670.  * implementations.  Add HELIX_FEATURE_DISABLE_INTERLOCKED_INC_DEC to 
  671.  * your profile's .pf or to your Umakefil/.pcf file to use non-threadsafe
  672.  * implementations.
  673.  */
  674. #include "atomicbase.h" 
  675. #if !defined HAVE_INTERLOCKED_INCREMENT
  676. #undef InterlockedIncrement
  677. #undef InterlockedDecrement
  678. #define InterlockedIncrement(plong) (++(*(plong)))
  679. #define InterlockedDecrement(plong) (--(*(plong)))
  680. #endif /* !defined HAVE_INTERLOCKED_INCREMENT */
  681. #if defined(HELIX_CONFIG_COMPACT_COM_MACROS)
  682. EXTERN_C void HX_AddRefFunc(IUnknown** pUnk);
  683. EXTERN_C void HX_ReleaseFunc(IUnknown** pUnk);
  684. #if defined(INITGUID) && (!defined(_STATICALLY_LINKED) || defined(NCIHACK))
  685. void HX_AddRefFunc(IUnknown** pUnk)
  686. {
  687.     if (*pUnk)
  688.     {
  689.         (*pUnk)->AddRef();
  690.     }
  691. }
  692. void HX_ReleaseFunc(IUnknown** pUnk)
  693. {
  694.     if (*pUnk)
  695.     {
  696.         (*pUnk)->Release();
  697.         *pUnk = 0;
  698.     }
  699. }
  700. #endif // INITGUID && (!_STATICALLY_LINKED || NCIHACK)
  701. #if defined(HELIX_CONFIG_TYPE_CHECK_COM_MACROS)
  702. #if defined(HELIX_CONFIG_TYPE_CHECK_COM_MACROS_IMPLICIT_CAST)
  703. #define HX_RELEASE(x) (HX_ReleaseFunc(&x))
  704. #define HX_ADDREF(x) (HX_AddRefFunc(&x))
  705. #else // defined(HELIX_CONFIG_TYPE_CHECK_COM_MACROS_IMPLICIT_CAST)
  706. // we don't want to build with this; this should be compiled only
  707. // to ensure that we have a COM object in the code base
  708. #define HX_RELEASE(x) 
  709. if (x) 
  710. IUnknown* pUnk; 
  711. (x)->QueryInterface(IID_IUnknown, (void**)&pUnk); 
  712. if (pUnk) 
  713. pUnk->Release(); 
  714. (x)->Release(); 
  715. (x) = 0; 
  716. #define HX_ADDREF(x) 
  717. if (x) 
  718. IUnknown* pUnk; 
  719. (x)->QueryInterface(IID_IUnknown, (void**)&pUnk); 
  720. if (pUnk) 
  721. pUnk->Release(); 
  722. (x)->AddRef(); 
  723. #endif // defined(HELIX_CONFIG_TYPE_CHECK_COM_MACROS_IMPLICIT_CAST)
  724. #else // defined(HELIX_CONFIG_TYPE_CHECK_COM_MACROS)
  725. #define HX_RELEASE(x) (HX_ReleaseFunc((IUnknown**)&(x)))
  726. #define HX_ADDREF(x) (HX_AddRefFunc((IUnknown**)&(x)))
  727. #endif // defined(HELIX_CONFIG_TYPE_CHECK_COM_MACROS)
  728. #else // defined(HELIX_CONFIG_COMPACT_COM_MACROS)
  729. #define HX_RELEASE(x) ((x) ? ((x)->Release(), (x) = 0) : 0)
  730. #define HX_ADDREF(x) ((x) ? ((x)->AddRef()) : 0)
  731. #endif // defined(HELIX_CONFIG_COMPACT_COM_MACROS)
  732. #endif /* _HXCOM_H_ */