pncom.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:19k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.  * 
  3.  *  $Id: pncom.h,v 1.1 2003/05/30 02:17:36 gabest Exp $
  4.  *
  5.  *  Copyright (C) 1995-1999 RealNetworks, Inc. All rights reserved.
  6.  *  
  7.  *  http://www.real.com/devzone
  8.  *
  9.  *  This program contains proprietary 
  10.  *  information of Progressive Networks, Inc, and is licensed
  11.  *  subject to restrictions on use and distribution.
  12.  *
  13.  *
  14.  *  Component Object Model defines, and macros
  15.  *
  16.  *  This file defines items required for COM interfaces in RealMedia and
  17.  *  Progressive Networks SDKs.
  18.  *
  19.  *
  20.  */
  21. #ifndef _PNCOM_H_
  22. #define _PNCOM_H_
  23. #include "pntypes.h" /* Needed for most type definitions */
  24. #include "string.h"
  25. // have to use the double expansion to get the prescan level
  26. #define STATCONCAT1(w,x,y,z) STATCONCAT2(w,x,y,z)
  27. #define STATCONCAT2(w,x,y,z) w##x##y##z  
  28. #ifdef _STATICALLY_LINKED
  29. #ifndef _PLUGINNAME
  30. #define ENTRYPOINT(func) STATCONCAT1(entrypoint_error_symbol_should_not_be_needed,_PLUGINNAME,_,func)
  31. #else /* _PLUGINNAME */
  32. #define ENTRYPOINT(func) STATCONCAT1(entrypoint_for_,_PLUGINNAME,_,func)
  33. #endif
  34. #else /* _STATICALLY_LINKED */
  35. #define ENTRYPOINT(func) func
  36. #endif
  37. /*
  38.  * We include objbase.h when building for windows so that pncom.h can 
  39.  * easily be used in any windows code.
  40.  */
  41. #ifdef _WIN32
  42. #include <objbase.h>
  43. #endif /* _WIN32 */
  44. #include "pnresult.h"
  45. /*
  46.  *  REF:
  47.  * Use this for reference parameters, so that C users can 
  48.  * use the interface as well.
  49.  */
  50. #if defined(__cplusplus)
  51. #define REF(type)   type&
  52. #else
  53. #define REF(type) const type * const
  54. #endif
  55. /*
  56.  *  CONSTMETHOD:
  57.  * Use this for constant methods in an interface 
  58.  * Compiles away under C
  59.  */
  60. #if !defined( CONSTMETHOD )
  61. #if defined(__cplusplus)
  62. #define CONSTMETHOD const
  63. #else
  64. #define CONSTMETHOD
  65. #endif
  66. #endif
  67. /*
  68.  *  CALL:
  69.  *
  70.  * Used by C users to easily call a function through an interface
  71.  *
  72.  *  EXAMPLE:
  73.  *
  74.  * pIFooObject->CALL(IFoo,DoSomething)(bar);
  75.  *
  76.  */
  77. #if !defined(__cplusplus) || defined(CINTERFACE)
  78. #define CALL(iface, func) iface##Vtbl->func
  79. #endif
  80. #define _INTERFACE struct
  81. /*
  82.  * If useing windows.h or the windows implementation of COM
  83.  * these defines are not needed.
  84.  */
  85. #if !defined( _OBJBASE_H_ ) 
  86. #ifdef _WIN16
  87. typedef unsigned int MMRESULT;
  88. #define FAR             _far
  89. #else
  90. #define FAR             
  91. #endif /* WIN16 */
  92. #define PASCAL          _pascal
  93. #define CDECL           _cdecl
  94. /*
  95.  * EXTERN_C
  96.  */
  97. #ifndef EXTERN_C
  98. #ifdef __cplusplus
  99. #define EXTERN_C    extern "C"
  100. #else
  101. #define EXTERN_C    extern
  102. #endif
  103. #endif
  104. #ifdef OLDERRORCODES
  105. #ifndef MAKE_HRESULT
  106. #define MAKE_HRESULT(sev,fac,code) ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))))
  107. #endif /*MAKE_HRESULT*/
  108. #endif /* OLDERRORCODES */
  109. /*
  110.  *  STDMETHODCALLTYPE
  111.  */
  112. #ifndef STDMETHODCALLTYPE
  113. #if defined(_WIN32) || defined(_MPPC_)
  114. #ifdef _MPPC_
  115. #define STDMETHODCALLTYPE       __cdecl
  116. #else
  117. #define STDMETHODCALLTYPE       __stdcall
  118. #endif
  119. #elif defined(_WIN16)
  120. #define STDMETHODCALLTYPE       __export FAR CDECL
  121. #else
  122. #define STDMETHODCALLTYPE
  123. #endif
  124. #endif
  125. /*
  126.  *  STDMETHODVCALLTYPE
  127.  */
  128. #ifndef STDMETHODVCALLTYPE
  129. #if defined(_WINDOWS) || defined(_MPPC_)
  130. #define STDMETHODVCALLTYPE      __cdecl
  131. #else
  132. #define STDMETHODVCALLTYPE
  133. #endif
  134. #endif
  135. /*
  136.  *  STDAPICALLTYPE
  137.  */
  138. #ifndef STDAPICALLTYPE
  139. #if defined(_WIN32) || defined(_MPPC_)
  140. #define STDAPICALLTYPE          __stdcall
  141. #elif defined(_WIN16)
  142. #define STDAPICALLTYPE          __export FAR PASCAL
  143. #else
  144. #define STDAPICALLTYPE
  145. #endif
  146. #endif
  147. /*
  148.  *  STDAPIVCALLTYPE
  149.  */
  150. #ifndef STDAPIVCALLTYPE
  151. #if defined(_WINDOWS) || defined(_MPPC_)
  152. #define STDAPIVCALLTYPE         __cdecl
  153. #else
  154. #define STDAPIVCALLTYPE
  155. #endif
  156. #endif
  157. /*
  158.  *  Standard API defines:
  159.  *
  160.  * NOTE: the 'V' versions allow Variable Argument lists.
  161.  *
  162.  * STDAPI
  163.  * STDAPI_(type)
  164.  * STDAPIV
  165.  * STDAPIV_(type)
  166.  */
  167. #ifndef STDAPI
  168. #define STDAPI                  EXTERN_C PN_RESULT STDAPICALLTYPE
  169. #endif
  170. #ifndef STDAPI_
  171. #define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
  172. #endif
  173. #ifndef STDAPIV
  174. #define STDAPIV                 EXTERN_C PN_RESULT STDAPIVCALLTYPE
  175. #endif
  176. #ifndef STDAPIV_
  177. #define STDAPIV_(type)          EXTERN_C type STDAPIVCALLTYPE
  178. #endif
  179. /*
  180.  *  Standard Interface Method defines:
  181.  *
  182.  * NOTE: the 'V' versions allow Variable Argument lists.
  183.  *
  184.  * STDMETHODIMP
  185.  * STDMETHODIMP_(type)
  186.  * STDMETHODIMPV
  187.  * STDMETHODIMPV_(type)
  188.  */
  189. #ifndef STDMETHODIMP
  190. #define STDMETHODIMP            PN_RESULT STDMETHODCALLTYPE
  191. #endif
  192. #ifndef STDMETHODIMP_
  193. #define STDMETHODIMP_(type)     type STDMETHODCALLTYPE
  194. #endif
  195. #ifndef STDMETHODIMPV
  196. #define STDMETHODIMPV           PN_RESULT STDMETHODVCALLTYPE
  197. #endif
  198. #ifndef STDMETHODIMPV_
  199. #define STDMETHODIMPV_(type)    type STDMETHODVCALLTYPE
  200. #endif
  201. /*
  202.  *
  203.  *  Interface Declaration
  204.  *
  205.  * These are macros for declaring interfaces.  They exist so that
  206.  * a single definition of the interface is simulataneously a proper
  207.  * declaration of the interface structures (C++ abstract classes)
  208.  * for both C and C++.
  209.  *
  210.  * DECLARE_INTERFACE(iface) is used to declare an interface that does
  211.  * not derive from a base interface.
  212.  * DECLARE_INTERFACE_(iface, baseiface) is used to declare an interface
  213.  * that does derive from a base interface.
  214.  *
  215.  * By default if the source file has a .c extension the C version of
  216.  * the interface declaratations will be expanded; if it has a .cpp
  217.  * extension the C++ version will be expanded. if you want to force
  218.  * the C version expansion even though the source file has a .cpp
  219.  * extension, then define the macro "CINTERFACE".
  220.  * eg.     cl -DCINTERFACE file.cpp
  221.  *
  222.  * Example Interface declaration:
  223.  *
  224.  *     #undef  INTERFACE
  225.  *     #define INTERFACE   IClassFactory
  226.  *
  227.  *     DECLARE_INTERFACE_(IClassFactory, IUnknown)
  228.  *     {
  229.  * // *** IUnknown methods 
  230.  *         STDMETHOD(QueryInterface) (THIS_
  231.  *                                   REFIID riid,
  232.  *                                   LPVOID FAR* ppvObj) PURE;
  233.  *         STDMETHOD_(ULONG,AddRef) (THIS) PURE;
  234.  *         STDMETHOD_(ULONG,Release) (THIS) PURE;
  235.  *
  236.  * // *** IClassFactory methods ***
  237.  * STDMETHOD(CreateInstance) (THIS_
  238.  *                           LPUNKNOWN pUnkOuter,
  239.  *                           REFIID riid,
  240.  *                           LPVOID FAR* ppvObject) PURE;
  241.  *     };
  242.  *
  243.  * Example C++ expansion:
  244.  *
  245.  *     struct FAR IClassFactory : public IUnknown
  246.  *     {
  247.  *         virtual PN_RESULT STDMETHODCALLTYPE QueryInterface(
  248.  *                                             IID FAR& riid,
  249.  *                                             LPVOID FAR* ppvObj) = 0;
  250.  *         virtual PN_RESULT STDMETHODCALLTYPE AddRef(void) = 0;
  251.  *         virtual PN_RESULT STDMETHODCALLTYPE Release(void) = 0;
  252.  *         virtual PN_RESULT STDMETHODCALLTYPE CreateInstance(
  253.  *                                         LPUNKNOWN pUnkOuter,
  254.  *                                         IID FAR& riid,
  255.  *                                         LPVOID FAR* ppvObject) = 0;
  256.  *     };
  257.  *
  258.  *     NOTE: Our documentation says '#define interface class' but we use
  259.  *     'struct' instead of 'class' to keep a lot of 'public:' lines
  260.  *     out of the interfaces.  The 'FAR' forces the 'this' pointers to
  261.  *     be far, which is what we need.
  262.  *
  263.  * Example C expansion:
  264.  *
  265.  *     typedef struct IClassFactory
  266.  *     {
  267.  *         const struct IClassFactoryVtbl FAR* lpVtbl;
  268.  *     } IClassFactory;
  269.  *
  270.  *     typedef struct IClassFactoryVtbl IClassFactoryVtbl;
  271.  *
  272.  *     struct IClassFactoryVtbl
  273.  *     {
  274.  *         PN_RESULT (STDMETHODCALLTYPE * QueryInterface) (
  275.  *                                             IClassFactory FAR* This,
  276.  *                                             IID FAR* riid,
  277.  *                                             LPVOID FAR* ppvObj) ;
  278.  *         PN_RESULT (STDMETHODCALLTYPE * AddRef) (IClassFactory FAR* This) ;
  279.  *         PN_RESULT (STDMETHODCALLTYPE * Release) (IClassFactory FAR* This) ;
  280.  *         PN_RESULT (STDMETHODCALLTYPE * CreateInstance) (
  281.  *                                             IClassFactory FAR* This,
  282.  *                                             LPUNKNOWN pUnkOuter,
  283.  *                                             IID FAR* riid,
  284.  *                                             LPVOID FAR* ppvObject);
  285.  *         PN_RESULT (STDMETHODCALLTYPE * LockServer) (
  286.  *                                             IClassFactory FAR* This,
  287.  * BOOL fLock);
  288.  *     };
  289.  *
  290.  */
  291. #if defined(__cplusplus) && !defined(CINTERFACE)
  292. #define _INTERFACE struct
  293. #define STDMETHOD(method)       virtual PN_RESULT STDMETHODCALLTYPE method
  294. #define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
  295. #define PURE                    = 0
  296. #define THIS_
  297. #define THIS                    void
  298. #if defined(_WINDOWS) && defined(EXPORT_CLASSES)
  299. #define DECLARE_INTERFACE(iface)    _INTERFACE PNEXPORT_CLASS iface
  300. #define DECLARE_INTERFACE_(iface, baseiface)    _INTERFACE PNEXPORT_CLASS iface : public baseiface
  301. #else
  302. #define DECLARE_INTERFACE(iface)    _INTERFACE iface
  303. #define DECLARE_INTERFACE_(iface, baseiface)    _INTERFACE iface : public baseiface
  304. #endif // defined(_WINDOWS) && defined(EXPORT_CLASSES)
  305. #if !defined(BEGIN_INTERFACE)
  306. #if defined(_MPPC_)  && 
  307.     ( (defined(_MSC_VER) || defined(__SC__) || defined(__MWERKS__)) && 
  308.     !defined(NO_NULL_VTABLE_ENTRY) )
  309.    #define BEGIN_INTERFACE virtual void a() {}
  310.    #define END_INTERFACE
  311. #else
  312.    #define BEGIN_INTERFACE
  313.    #define END_INTERFACE
  314. #endif
  315. #endif
  316. #else
  317. #define _INTERFACE               struct
  318. #define STDMETHOD(method)       PN_RESULT (STDMETHODCALLTYPE * method)
  319. #define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)
  320. #if !defined(BEGIN_INTERFACE)
  321. #if defined(_MPPC_)
  322.     #define BEGIN_INTERFACE       void    *b;
  323.     #define END_INTERFACE
  324. #else
  325.     #define BEGIN_INTERFACE
  326.     #define END_INTERFACE
  327. #endif
  328. #endif
  329. #define PURE
  330. #define THIS_                   INTERFACE FAR* This,
  331. #define THIS                    INTERFACE FAR* This
  332. #ifdef CONST_VTABLE
  333. #undef CONST_VTBL
  334. #define CONST_VTBL const
  335. #define DECLARE_INTERFACE(iface)    typedef _INTERFACE iface { 
  336.                                     const struct iface##Vtbl FAR* lpVtbl; 
  337.                                 } iface; 
  338.                                 typedef const struct iface##Vtbl iface##Vtbl; 
  339.                                 const struct iface##Vtbl
  340. #else
  341. #undef CONST_VTBL
  342. #define CONST_VTBL
  343. #define DECLARE_INTERFACE(iface)    typedef _INTERFACE iface { 
  344.                                     struct iface##Vtbl FAR* lpVtbl; 
  345.                                 } iface; 
  346.                                 typedef struct iface##Vtbl iface##Vtbl; 
  347.                                 struct iface##Vtbl
  348. #endif
  349. #define DECLARE_INTERFACE_(iface, baseiface)    DECLARE_INTERFACE(iface)
  350. #endif
  351. /*
  352.  *  COMMON TYPES
  353.  */
  354. #ifndef GUID_DEFINED
  355. #define GUID_DEFINED
  356. typedef struct  _GUID
  357.     {
  358.     ULONG32 Data1;
  359.     UINT16 Data2;
  360.     UINT16 Data3;
  361.     UCHAR Data4[ 8 ];
  362.     } GUID;
  363. #endif
  364. #if !defined( __IID_DEFINED__ )
  365. #define __IID_DEFINED__
  366. typedef GUID IID;
  367. #define IID_NULL            GUID_NULL
  368. typedef GUID CLSID;
  369. #define CLSID_NULL          GUID_NULL
  370. #if defined(__cplusplus)
  371. #ifndef _REFGUID_DEFINED
  372. #define _REFGUID_DEFINED
  373. #define REFGUID             const GUID &
  374. #endif
  375. #ifndef _REFIID_DEFINED
  376. #define _REFIID_DEFINED
  377. #define REFIID              const IID &
  378. #endif
  379. #ifndef _REFCLSID_DEFINED
  380. #define _REFCLSID_DEFINED
  381. #define REFCLSID            const CLSID &
  382. #endif
  383. #else
  384. #ifndef _REFGUID_DEFINED
  385. #define _REFGUID_DEFINED
  386. #define REFGUID             const GUID * const
  387. #endif
  388. #ifndef _REFIID_DEFINED
  389. #define _REFIID_DEFINED
  390. #define REFIID              const IID * const
  391. #endif
  392. #ifndef _REFCLSID_DEFINED
  393. #define _REFCLSID_DEFINED
  394. #define REFCLSID            const CLSID * const
  395. #endif
  396. #endif
  397. #endif
  398. /*
  399.  *
  400.  * macros to define byte pattern for a GUID.
  401.  *      Example: DEFINE_GUID(GUID_XXX, a, b, c, ...);
  402.  *
  403.  * Each dll/exe must initialize the GUIDs once.  This is done in one of
  404.  * two ways.  If you are not using precompiled headers for the file(s) which
  405.  * initializes the GUIDs, define INITGUID before including objbase.h.  This
  406.  * is how OLE builds the initialized versions of the GUIDs which are included
  407.  * in ole2.lib.  The GUIDs in ole2.lib are all defined in the same text
  408.  * segment GUID_TEXT.
  409.  *
  410.  * The alternative (which some versions of the compiler don't handle properly;
  411.  * they wind up with the initialized GUIDs in a data, not a text segment),
  412.  * is to use a precompiled version of objbase.h and then include initguid.h
  413.  * after objbase.h followed by one or more of the guid defintion files.
  414.  *
  415.  */
  416. #if !defined (INITGUID) || (defined (_STATICALLY_LINKED) && !defined(NCIHACK))
  417. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  418.     EXTERN_C const GUID FAR name
  419. #else
  420. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  421.         EXTERN_C const GUID name 
  422.                 = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
  423. #endif
  424. #ifndef _VXWORKS
  425. #include <memory.h> /* for memcmp */
  426. #endif
  427. #ifdef __cplusplus
  428. inline BOOL IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
  429. {
  430.     return !memcmp(&rguid1, &rguid2, sizeof(GUID));
  431. }
  432. inline void SetGUID(GUID& rguid1, REFGUID rguid2)
  433. {
  434.     memcpy(&rguid1, &rguid2, sizeof(GUID));
  435. }
  436. #else
  437. #define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
  438. #define SetGUID(rguid1, rguid2) (memcpy(rguid1, rguid2, sizeof(GUID)))
  439. #endif
  440. #define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
  441. #define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
  442. #define SetIID(riid1, riid2)     SetGUID(riid1, riid2)
  443. #define SetCLSID(rclsid1, rclsid2)  SetGUID(rclsid1, rclsid2)
  444. #ifdef __cplusplus
  445. /*
  446.  * Because GUID is defined elsewhere in WIN32 land, the operator == and !=
  447.  * are moved outside the class to global scope.
  448.  */
  449. inline BOOL operator==(const GUID& guidOne, const GUID& guidOther)
  450. {
  451.     return !memcmp(&guidOne,&guidOther,sizeof(GUID));
  452. }
  453. inline BOOL operator!=(const GUID& guidOne, const GUID& guidOther)
  454. {
  455.     return !(guidOne == guidOther);
  456. }
  457. #endif
  458. /****************************************************************************
  459.  * 
  460.  *  Interface:
  461.  *
  462.  * IUnknown
  463.  *
  464.  *  Purpose:
  465.  *
  466.  * Base class of all interfaces. Defines life time management and
  467.  * support for dynamic cast.
  468.  *
  469.  *  IID_IUnknown:
  470.  *
  471.  * {00000000-0000-0000-C000000000000046}
  472.  *
  473.  */
  474. DEFINE_GUID(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 
  475. 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
  476. #undef  INTERFACE
  477. #define INTERFACE   IUnknown
  478. DECLARE_INTERFACE(IUnknown)
  479. {
  480.     STDMETHOD(QueryInterface) (THIS_
  481. REFIID riid,
  482. void** ppvObj) PURE;
  483.     STDMETHOD_(ULONG,AddRef) (THIS) PURE;
  484.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  485. };
  486. /****************************************************************************
  487.  * 
  488.  *  Interface:
  489.  *
  490.  * IMalloc
  491.  *
  492.  *  Purpose:
  493.  *
  494.  * Basic memory management interface.
  495.  *
  496.  *  IID_IMalloc:
  497.  *
  498.  * {00000002-0000-0000-C000000000000046}
  499.  *
  500.  */
  501. DEFINE_GUID(IID_IMalloc, 00000002, 0x0000, 0x0000, 0xC0, 0x00, 
  502. 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
  503. #undef  INTERFACE
  504. #define INTERFACE   IMalloc
  505. DECLARE_INTERFACE_(IMalloc, IUnknown)
  506. {
  507.     /*
  508.      * IUnknown methods
  509.      */
  510.     STDMETHOD(QueryInterface) (THIS_
  511. REFIID riid,
  512. void** ppvObj) PURE;
  513.     STDMETHOD_(ULONG,AddRef) (THIS) PURE;
  514.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  515.     /*
  516.      * IMalloc methods
  517.      */
  518.     STDMETHOD_(void*,Alloc)     (THIS_
  519.     UINT32  /*IN*/ count) PURE;
  520.     STDMETHOD_(void*,Realloc)     (THIS_
  521.     void*   /*IN*/ pMem,
  522.     UINT32  /*IN*/ count) PURE;
  523.     STDMETHOD_(void,Free)     (THIS_
  524.     void*   /*IN*/ pMem) PURE;
  525.     STDMETHOD_(UINT32,GetSize)     (THIS_
  526.     void*   /*IN*/ pMem) PURE;
  527.     STDMETHOD_(BOOL,DidAlloc)     (THIS_
  528.     void*   /*IN*/ pMem) PURE;
  529.     STDMETHOD_(void,HeapMinimize)   (THIS) PURE;
  530. };
  531. /*
  532.  *
  533.  *  Synchronization: NOTE: These should be made thread safe or use built
  534.  *  in synchronization support in an OS that supports it.
  535.  *
  536.  */
  537. #define InterlockedIncrement(plong) (++(*(plong)))
  538. #define InterlockedDecrement(plong) (--(*(plong)))
  539. #else /* else case of !defined( _OBJBASE_H_ ) && !defined( _COMPOBJ_H_ ) */
  540. /* Even in windows we want these GUID's defined... */
  541. #if !(defined(INITGUID) && defined(USE_IUNKNOWN_AND_IMALLOC_FROM_UUID_LIB))
  542. DEFINE_GUID(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 
  543. 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
  544. DEFINE_GUID(IID_IMalloc, 00000002, 0x0000, 0x0000, 0xC0, 0x00, 
  545. 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
  546. #endif
  547. #include <memory.h> /* for memcmp */
  548. #ifdef __cplusplus
  549. inline void SetGUID(REFGUID rguid1, REFGUID rguid2)
  550. {
  551.     memcpy((void*)&rguid1, (void*)&rguid2, sizeof(GUID));
  552. }
  553. #else
  554. #define SetGUID(rguid1, rguid2) (memcpy((void*)rguid1, (void*)rguid2, sizeof(GUID)))
  555. #endif
  556. #define SetIID(riid1, riid2)     SetGUID(riid1, riid2)
  557. #define SetCLSID(rclsid1, rclsid2)  SetGUID(rclsid1, rclsid2)
  558. #endif /* !defined( _OBJBASE_H_ ) && !defined( _COMPOBJ_H_ )*/
  559. #ifdef IsEqualIID
  560. #undef IsEqualIID
  561. #endif
  562. #ifdef IsEqualCLSID
  563. #undef IsEqualCLSID
  564. #endif
  565. #define IsEqualIID(riid1, riid2) RNIsEqualGUID(riid1, riid2)
  566. #define IsEqualCLSID(rclsid1, rclsid2) RNIsEqualGUID(rclsid1, rclsid2)
  567. #ifdef __cplusplus
  568. inline BOOL RNIsEqualGUID(REFGUID rguid1, REFGUID rguid2)
  569. {
  570.    return (((UINT32*) &rguid1)[0] == ((UINT32*) &rguid2)[0]  &&
  571.     ((UINT32*) &rguid1)[1] == ((UINT32*) &rguid2)[1] &&
  572.     ((UINT32*) &rguid1)[2] == ((UINT32*) &rguid2)[2] &&
  573.     ((UINT32*) &rguid1)[3] == ((UINT32*) &rguid2)[3]);
  574. }
  575. #else
  576. #define RNIsEqualGUID(rguid1, rguid2)
  577. (((UINT32*) &rguid1)[0] == ((UINT32*) &rguid2)[0]  &&   
  578.     ((UINT32*) &rguid1)[1] == ((UINT32*) &rguid2)[1] && 
  579.     ((UINT32*) &rguid1)[2] == ((UINT32*) &rguid2)[2] && 
  580.     ((UINT32*) &rguid1)[3] == ((UINT32*) &rguid2)[3]);
  581. #endif
  582. /****************************************************************************
  583.  *
  584.  *  Putting the following macro in the definition of your class will overload
  585.  *  new and delete for that object.  New will then take an IMalloc* from
  586.  *  which to allocate memory from and store it in the begining of the
  587.  *  memory which it will return.  Delete will grab this IMalloc* from
  588.  *  the beginning of the mem and use this pointer to deallocate the mem.
  589.  *
  590.  *  Example useage:
  591.  *  class A
  592.  *  {
  593.  *  public:
  594.  *      A(int);
  595.  *      ~A();
  596.  *
  597.  *      IMALLOC_MEM
  598.  *  };
  599.  *
  600.  *  IMalloc* pMalloc;
  601.  *  m_pContext->QueryInterface(IID_IMalloc, (void**)&pMalloc);
  602.  *  A* p = new(pMalloc) A(0);
  603.  *  pMalloc->Release();
  604.  *  delete p;
  605.  */
  606. #define IMALLOC_MEM
  607.     void* operator new(size_t size, IMalloc* pMalloc)
  608.     {
  609.         void* pMem = pMalloc->Alloc(size + sizeof(IMalloc*));
  610.         *(IMalloc**)pMem = pMalloc;
  611.         pMalloc->AddRef();
  612.         return ((unsigned char*)pMem + sizeof(IMalloc*));
  613.     }
  614.     void operator delete(void* pMem)
  615.     {
  616.         pMem = (unsigned char*)pMem - sizeof(IMalloc*);
  617.         IMalloc* pMalloc = *(IMalloc**)pMem;
  618.         pMalloc->Free(pMem);
  619.         pMalloc->Release();
  620.     }
  621. #endif /* _PNCOM_H_ */