mspenum.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. #ifdef __cplusplus
  9. template <class Base,const IID *piid,class T,class Copy,class ThreadModel = CComObjectThreadModel>
  10. class ATL_NO_VTABLE CSafeComEnum : public CComEnumImpl<Base,piid,T,Copy>,public CComObjectRootEx< ThreadModel >
  11. {
  12. typedef CSafeComEnum<Base,piid,T,Copy,ThreadModel> ThisClass;
  13. typedef CComEnumImpl<Base,piid,T,Copy> BaseClass;
  14. STDMETHOD(Next)(ULONG celt,T *rgelt,ULONG *pceltFetched) {
  15. if(IsBadWritePtr(rgelt,celt *sizeof(T))) return E_POINTER;
  16. if((pceltFetched!=NULL) && IsBadWritePtr(pceltFetched,sizeof(ULONG))) return E_POINTER;
  17. return BaseClass::Next(celt,rgelt,pceltFetched);
  18. }
  19. STDMETHOD(Clone)(Base **ppEnum) {
  20. if(IsBadWritePtr(ppEnum,sizeof(Base *))) return E_POINTER;
  21. return BaseClass::Clone(ppEnum);
  22. }
  23. BEGIN_COM_MAP(ThisClass)
  24. COM_INTERFACE_ENTRY_IID(*piid,BaseClass)
  25. COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
  26. END_COM_MAP()
  27. DECLARE_GET_CONTROLLING_UNKNOWN()
  28. HRESULT Init(T *begin,T *end,IUnknown *pUnk,CComEnumFlags flags = AtlFlagNoCopy) {
  29. HRESULT hr;
  30. IUnknown *pIU = GetControllingUnknown();
  31. hr = CoCreateFreeThreadedMarshaler(pIU,& m_pFTM);
  32. if(FAILED(hr)) return hr;
  33. return BaseClass::Init(begin,end,pUnk,flags);
  34. }
  35. CSafeComEnum() { m_pFTM = NULL; }
  36. void FinalRelease(void) {
  37. if(m_pFTM) {
  38. m_pFTM->Release();
  39. }
  40. CComObjectRootEx< ThreadModel >::FinalRelease();
  41. }
  42. protected:
  43. IUnknown *m_pFTM;
  44. };
  45. #endif /* __cplusplus */
  46. #endif