| 1 | /** |
| 2 | * This file has no copyright assigned and is placed in the Public Domain. |
| 3 | * This file is part of the mingw-w64 runtime package. |
| 4 | * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| 5 | */ |
| 6 | #ifndef _MSPENUM_H_ |
| 7 | #define _MSPENUM_H_ |
| 8 | |
| 9 | #ifdef __cplusplus |
| 10 | |
| 11 | template <class Base,const IID *piid,class T,class Copy,class ThreadModel = CComObjectThreadModel> |
| 12 | class ATL_NO_VTABLE CSafeComEnum : public CComEnumImpl<Base,piid,T,Copy>,public CComObjectRootEx< ThreadModel > |
| 13 | { |
| 14 | typedef CSafeComEnum<Base,piid,T,Copy,ThreadModel> ThisClass; |
| 15 | typedef CComEnumImpl<Base,piid,T,Copy> BaseClass; |
| 16 | STDMETHOD(Next)(ULONG celt,T *rgelt,ULONG *pceltFetched) { |
| 17 | if(IsBadWritePtr(rgelt,celt *sizeof(T))) return E_POINTER; |
| 18 | if((pceltFetched!=NULL) && IsBadWritePtr(pceltFetched,sizeof(ULONG))) return E_POINTER; |
| 19 | return BaseClass::Next(celt,rgelt,pceltFetched); |
| 20 | } |
| 21 | STDMETHOD(Clone)(Base **ppEnum) { |
| 22 | if(IsBadWritePtr(ppEnum,sizeof(Base *))) return E_POINTER; |
| 23 | return BaseClass::Clone(ppEnum); |
| 24 | } |
| 25 | BEGIN_COM_MAP(ThisClass) |
| 26 | COM_INTERFACE_ENTRY_IID(*piid,BaseClass) |
| 27 | COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM) |
| 28 | END_COM_MAP() |
| 29 | DECLARE_GET_CONTROLLING_UNKNOWN() |
| 30 | HRESULT Init(T *begin,T *end,IUnknown *pUnk,CComEnumFlags flags = AtlFlagNoCopy) { |
| 31 | HRESULT hr; |
| 32 | IUnknown *pIU = GetControllingUnknown(); |
| 33 | hr = CoCreateFreeThreadedMarshaler(pIU,& m_pFTM); |
| 34 | if(FAILED(hr)) return hr; |
| 35 | return BaseClass::Init(begin,end,pUnk,flags); |
| 36 | } |
| 37 | CSafeComEnum() { m_pFTM = NULL; } |
| 38 | void FinalRelease(void) { |
| 39 | if(m_pFTM) { |
| 40 | m_pFTM->Release(); |
| 41 | } |
| 42 | CComObjectRootEx< ThreadModel >::FinalRelease(); |
| 43 | } |
| 44 | protected: |
| 45 | IUnknown *m_pFTM; |
| 46 | }; |
| 47 | |
| 48 | #endif /* __cplusplus */ |
| 49 | |
| 50 | #endif |
| 51 | |