123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- /**
- * 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
|