| /** | |
| * This file has no copyright assigned and is placed in the Public Domain. | |
| * This file is part of the mingw-w64 runtime package. | |
| * No warranty is given; refer to the file DISCLAIMER.PD within this package. | |
| */ | |
| #ifndef _MSPENUM_H_ | |
| #define _MSPENUM_H_ | |
| #ifdef __cplusplus | |
| template <class Base,const IID *piid,class T,class Copy,class ThreadModel = CComObjectThreadModel> | |
| class ATL_NO_VTABLE CSafeComEnum : public CComEnumImpl<Base,piid,T,Copy>,public CComObjectRootEx< ThreadModel > | |
| { | |
| typedef CSafeComEnum<Base,piid,T,Copy,ThreadModel> ThisClass; | |
| typedef CComEnumImpl<Base,piid,T,Copy> BaseClass; | |
| STDMETHOD(Next)(ULONG celt,T *rgelt,ULONG *pceltFetched) { | |
| if(IsBadWritePtr(rgelt,celt *sizeof(T))) return E_POINTER; | |
| if((pceltFetched!=NULL) && IsBadWritePtr(pceltFetched,sizeof(ULONG))) return E_POINTER; | |
| return BaseClass::Next(celt,rgelt,pceltFetched); | |
| } | |
| STDMETHOD(Clone)(Base **ppEnum) { | |
| if(IsBadWritePtr(ppEnum,sizeof(Base *))) return E_POINTER; | |
| return BaseClass::Clone(ppEnum); | |
| } | |
| BEGIN_COM_MAP(ThisClass) | |
| COM_INTERFACE_ENTRY_IID(*piid,BaseClass) | |
| COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM) | |
| END_COM_MAP() | |
| DECLARE_GET_CONTROLLING_UNKNOWN() | |
| HRESULT Init(T *begin,T *end,IUnknown *pUnk,CComEnumFlags flags = AtlFlagNoCopy) { | |
| HRESULT hr; | |
| IUnknown *pIU = GetControllingUnknown(); | |
| hr = CoCreateFreeThreadedMarshaler(pIU,& m_pFTM); | |
| if(FAILED(hr)) return hr; | |
| return BaseClass::Init(begin,end,pUnk,flags); | |
| } | |
| CSafeComEnum() { m_pFTM = NULL; } | |
| void FinalRelease(void) { | |
| if(m_pFTM) { | |
| m_pFTM->Release(); | |
| } | |
| CComObjectRootEx< ThreadModel >::FinalRelease(); | |
| } | |
| protected: | |
| IUnknown *m_pFTM; | |
| }; | |
| #endif /* __cplusplus */ | |
| #endif | |