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