atlhelpers.h
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:6k
源码类别:

Shell编程

开发平台:

Visual C++

  1. // AtlHelpers.h: interface for the AtlHelpers class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_ATLHELPERS_H__6B3ABF84_BEF6_11D3_82EA_0080AD509054__INCLUDED_)
  5. #define AFX_ATLHELPERS_H__6B3ABF84_BEF6_11D3_82EA_0080AD509054__INCLUDED_
  6. #pragma once
  7. //
  8. // atlhelpers.h - My ATL helper functions
  9. //
  10. // Written by Bjarke Viksoe (bjarke@viksoe.dk)
  11. // Copyright (c) 2000-2001 Bjarke Viksoe.
  12. //
  13. // This code may be used in compiled form in any way you desire. This
  14. // file may be redistributed by any means PROVIDING it is 
  15. // not sold for profit without the authors written consent, and 
  16. // providing that this notice and the authors name is included. 
  17. //
  18. // This file is provided "as is" with no expressed or implied warranty.
  19. // The author accepts no liability if it causes any damage to you or your
  20. // computer whatsoever. It's free, so don't hassle me about it.
  21. //
  22. // Beware of bugs.
  23. //
  24. #ifndef __ATLCOM_H__
  25.    #error atlhelpers.h requires atlcom.h to be included first
  26. #endif
  27. // Neat macros someone always leaves out
  28. #ifndef lengthof
  29.    #define lengthof(x) (sizeof(x)/sizeof(*x))
  30. #endif
  31. #ifndef offsetof
  32.   #define offsetof(type, field) ((int)&((type*)0)->field)
  33. #endif
  34. // The annoying missing VARIANT type!
  35. // Use this to construct an optional VARIANT argument value.
  36. // A lot of COM implementations actually check for this code for
  37. // their optional automation arguments.
  38. // Usage: CComVariant vEmpty(VT_MISSING)
  39. #define VT_MISSING DISP_E_PARAMNOTFOUND, VT_ERROR
  40. //
  41. // ATL error handlers and validating macros
  42. //
  43. #ifdef _DEBUG
  44. #define HR(expr) if(FAILED(Hr=expr)) { _CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, NULL, #expr); _CrtDbgBreak(); return Hr; }
  45. #define VALIDATE_POINTER(p) ATLASSERT(p); if(!p) return E_POINTER
  46. #define VALIDATE_OUT_POINTER(p) ATLASSERT(p); if(!p) return E_POINTER; else *p=NULL
  47. #else
  48. #define HR(expr) if(FAILED(Hr=expr)) return Hr
  49. #define VALIDATE_POINTER(p) if(!p) return E_POINTER
  50. #define VALIDATE_OUT_POINTER(p) if(!p) return E_POINTER; else *p=NULL
  51. #endif
  52. #define USE_ARG(arg) arg
  53. //
  54. // Conversions
  55. //
  56. #define BOOL_TO_VARIANTBOOL(f) (f ? VARIANT_TRUE : VARIANT_FALSE)
  57. #define VARIANTBOOL_TO_BOOL(f) (f!=VARIANT_FALSE)
  58. //
  59. // BSTR and other methods missing in ATL library
  60. //
  61. inline HRESULT CComVariant_CopyTo(VARIANT* dest, VARIANT *src) {
  62.    return ::VariantCopy(dest, src);
  63. }
  64. //
  65. // The great Auto Memory Release template class,
  66. // which is located in the ATL OleDB file. We don't
  67. // want to include atldb.h all the time, so here is
  68. // the class.
  69. //
  70. #ifndef __ATLDB_H
  71. template <class T>
  72. class CRunTimeFree
  73. {
  74. public:
  75.    static void Free(T* pData) { delete [] pData; }
  76. };
  77. template <class T>
  78. class CComFree
  79. {
  80. public:
  81.    static void Free(T* pData) { ::CoTaskMemFree(pData); }
  82. };
  83. template <class T, class DeAllocator = CRunTimeFree< T > >
  84. class CAutoMemRelease
  85. {
  86. public:
  87.    CAutoMemRelease()
  88.    {
  89.       m_pData = NULL;
  90.    }
  91.    CAutoMemRelease(T* pData)
  92.    {
  93.       m_pData = pData;
  94.    }
  95.    ~CAutoMemRelease()
  96.    {
  97.       Attach(NULL);
  98.    }
  99.    void Attach(T* pData)
  100.    {
  101.       DeAllocator::Free(m_pData);
  102.       m_pData = pData;
  103.    }
  104.    T* Detach()
  105.    {
  106.       T* pTemp = m_pData;
  107.       m_pData = NULL;
  108.       return pTemp;
  109.    }
  110.    T* m_pData;
  111. };
  112. #endif
  113. //
  114. // "Copy Policy" helper functions for implementing collections.
  115. // These are mostly ripped from the book "ATL Internals" by Rector & Sells.
  116. //
  117. template< typename T >
  118. struct _CopyVariantFromAdaptItf 
  119. {
  120.    static HRESULT copy(VARIANT *p1, CAdapt< CComPtr<T> > *p2) 
  121.    {
  122.       HRESULT Hr = p2->m_T->QueryInterface(IID_IDispatch, (void **)&p1->pdispVal);
  123.       if( SUCCEEDED(Hr) ) {
  124.          p1->vt = VT_DISPATCH;
  125.       }
  126.       else {
  127.          Hr = p2->m_T->QueryInterface(IID_IUnknown, (void **)&p1->punkVal);
  128.          if( SUCCEEDED(Hr) ) p1->vt = VT_UNKNOWN;
  129.       };
  130.       return Hr;
  131.    };
  132.    static void init(VARIANT *p) { ::VariantInit(p); };
  133.    static void destroy(VARIANT *p) { ::VariantClear(p); };
  134. };
  135. template< typename T >
  136. struct _CopyItfFromAdaptItf 
  137. {
  138.    static HRESULT copy(T **p1, CAdapt< CComPtr<T> > *p2) 
  139.    {
  140.       if( *p1=p2->m_T ) return (*p1)->AddRef(), S_OK;
  141.       return E_POINTER;
  142.    }
  143.    static void init(T** p) {};
  144.    static void destroy(T **p) { if(*p) return (*p)->Release(); }
  145. };
  146. // My copy-policy classes for CComObject<T>
  147. template< typename T >
  148. struct _CopyVariantFromAdaptComObj
  149. {
  150.    static HRESULT copy(VARIANT *p1, CAdapt< CComObject<T> > *p2) 
  151.    {
  152.       HRESULT Hr = p2->m_T->QueryInterface(IID_IDispatch, (void **)&p1->pdispVal);
  153.       if( SUCCEEDED(Hr) ) {
  154.          p1->vt = VT_DISPATCH;
  155.       }
  156.       else {
  157.          Hr = p2->m_T->QueryInterface(IID_IUnknown, (void **)&p1->punkVal);
  158.          if( SUCCEEDED(Hr) ) p1->vt = VT_UNKNOWN;
  159.       };
  160.       return Hr;
  161.    };
  162.    static void init(VARIANT *p) { ::VariantInit(p); };
  163.    static void destroy(VARIANT *p) { ::VariantClear(p); };
  164. };
  165. template< typename T, typename Base >
  166. struct _CopyItfFromAdaptComObj
  167. {
  168.    static HRESULT copy(T **p1, CAdapt< CComObject<T> > *p2) 
  169.    {
  170.       if( *p1=p2->m_T ) return (*p1)->AddRef(), S_OK;
  171.       return E_POINTER;
  172.    }
  173.    static void init(T** p) {};
  174.    static void destroy(T **p) { if(*p) return (*p)->Release(); }
  175. };
  176. //
  177. // QI for 'this' (also from "ATL Internals"):
  178. // Note that this will not work if caller and callee do not run in the same context!
  179. //
  180. inline HRESULT WINAPI _This(void* pv, REFIID iid, void** ppvObject, DWORD) 
  181. {
  182.    ATLASSERT(iid==IID_NULL);
  183.    iid;
  184.    *ppvObject = pv;
  185.    return S_OK;
  186. }
  187. #define COM_INTERFACE_ENTRY_THIS() COM_INTERFACE_ENTRY_FUNC(IID_NULL, 0, _This)
  188. #endif // !defined(AFX_ATLHELPERS_H__6B3ABF84_BEF6_11D3_82EA_0080AD509054__INCLUDED_)