[1166] | 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 |
|
---|