| 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 |
|