hxcom.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:25k
源码类别:

Symbian

开发平台:

Visual C++

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