codeArt

codeArt

BEGIN_COM_MAP和END_COM_MAP

  1 #define BEGIN_COM_MAP(x) public: \
  2     typedef x _ComMapClass; \
  3     static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD_PTR dw) throw()\
  4 {\
  5     _ComMapClass* p = (_ComMapClass*)pv;\
  6     p->Lock();\
  7     HRESULT hRes = E_FAIL; \
  8     __try \
  9 { \
 10     hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw);\
 11 } \
 12     __finally \
 13 { \
 14     p->Unlock();\
 15 } \
 16     return hRes;\
 17 }\
 18     IUnknown* _GetRawUnknown() throw() \
 19 { ATLASSERT(_GetEntries()[0].pFunc == _ATL_SIMPLEMAPENTRY); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } \
 20     _ATL_DECLARE_GET_UNKNOWN(x)\
 21     HRESULT _InternalQueryInterface(REFIID iid, void** ppvObject) throw() \
 22 return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } \
 23     const static ATL::_ATL_INTMAP_ENTRY* WINAPI _GetEntries() throw() { \
 24     static const ATL::_ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x)
 25 
 26 #ifdef _ATL_DEBUG
 27 #define DEBUG_QI_ENTRY(x) \
 28 {NULL, \
 29     (DWORD_PTR)_T(#x), \
 30     (ATL::_ATL_CREATORARGFUNC*)0},
 31 #else
 32 #define DEBUG_QI_ENTRY(x)
 33 #endif //_ATL_DEBUG
 34 
 35 #define COM_INTERFACE_ENTRY_IMPL(x)\
 36     COM_INTERFACE_ENTRY_IID(_ATL_IIDOF(x), x##Impl<_ComMapClass>)
 37 
 38 #define _ATL_IIDOF(x) __uuidof(x)
 39 
 40 #define COM_INTERFACE_ENTRY_IID(iid, x)\
 41 {&iid,\
 42     offsetofclass(x, _ComMapClass),\
 43     _ATL_SIMPLEMAPENTRY},
 44 
 45 #define offsetofclass(base, derived) ((DWORD_PTR)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING)
 46 
 47 #define _ATL_SIMPLEMAPENTRY ((ATL::_ATL_CREATORARGFUNC*)1)
 48 
 49 #define COM_INTERFACE_ENTRY(x)\
 50 {&_ATL_IIDOF(x), \
 51     offsetofclass(x, _ComMapClass), \
 52     _ATL_SIMPLEMAPENTRY},
 53 
 54 #define END_COM_MAP() \
 55     __if_exists(_GetAttrEntries) {{NULL, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, }\
 56 {NULL, 00}}; return &_entries[1];} \
 57     virtual ULONG STDMETHODCALLTYPE AddRef( voidthrow() = 0; \
 58     virtual ULONG STDMETHODCALLTYPE Release( voidthrow() = 0; \
 59     STDMETHOD(QueryInterface)(REFIID, void**throw() = 0;
 60 #else
 61 #define END_COM_MAP() \
 62     __if_exists(_GetAttrEntries) {{NULL, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, }\
 63 {NULL, 00}}; return _entries;} \
 64     virtual ULONG STDMETHODCALLTYPE AddRef( voidthrow() = 0; \
 65     virtual ULONG STDMETHODCALLTYPE Release( voidthrow() = 0; \
 66     STDMETHOD(QueryInterface)(REFIID, void**throw() = 0;
 67 #endif // _ATL_DEBUG
 68 
 69 
 70 //------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 71 class d
 72 {
 73 public:
 74     d(){}
 75     typedef x _ComMapClass;
 76     static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD_PTR dw) throw()\
 77     {
 78         _ComMapClass* p = (_ComMapClass*)pv;
 79         p->Lock();
 80         HRESULT hRes = E_FAIL;
 81         __try
 82         {
 83             hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw);
 84         }
 85         __finally
 86         {
 87             p->Unlock();
 88         }
 89         return hRes;
 90     }
 91     IUnknown* _GetRawUnknown() throw()
 92     { ATLASSERT(_GetEntries()[0].pFunc == _ATL_SIMPLEMAPENTRY); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); }
 93     _ATL_DECLARE_GET_UNKNOWN(x)
 94         HRESULT _InternalQueryInterface(REFIID iid, void** ppvObject) throw()
 95     { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); }
 96     const static ATL::_ATL_INTMAP_ENTRY* WINAPI _GetEntries() throw()
 97     {
 98         static const ATL::_ATL_INTMAP_ENTRY _entries[] =
 99         {
100             {NULL, (DWORD_PTR)_T(#x), (ATL::_ATL_CREATORARGFUNC*)0},
101             {&iid, ((DWORD_PTR)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING), ((ATL::_ATL_CREATORARGFUNC*)1)},
102             {&__uuidof(x), ((DWORD_PTR)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING), ((ATL::_ATL_CREATORARGFUNC*)1)},
103             __if_exists(_GetAttrEntries) {{NULL, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, }
104             {NULL, 00}
105         };
106         return &_entries[1];
107     }
108     virtual ULONG STDMETHODCALLTYPE AddRef( voidthrow() = 0;
109     virtual ULONG STDMETHODCALLTYPE Release( voidthrow() = 0;
110     STDMETHOD(QueryInterface)(REFIID, void**throw() = 0;
111 }

posted on 2010-07-05 15:45 codeArt 阅读(2296) 评论(0)  编辑 收藏 引用 所属分类: COM


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章档案

编程与开源

搜索

最新评论

阅读排行榜

评论排行榜