comparison fuhtark_test/include/winapi/mspenum.h @ 1500:91c8c3b7cbf0

add: futhark tests for generating vulkan api
author sam <sam@basx.dev>
date Wed, 26 Nov 2025 21:36:48 +0700
parents
children
comparison
equal deleted inserted replaced
1499:1f58458b7ef7 1500:91c8c3b7cbf0
1 #ifndef _MSPENUM_H_
2 #define _MSPENUM_H_
3
4 #ifdef __cplusplus
5
6 template <class Base,const IID *piid,class T,class Copy,class ThreadModel = CComObjectThreadModel>
7 class ATL_NO_VTABLE CSafeComEnum : public CComEnumImpl<Base,piid,T,Copy>,public CComObjectRootEx< ThreadModel >
8 {
9 typedef CSafeComEnum<Base,piid,T,Copy,ThreadModel> ThisClass;
10 typedef CComEnumImpl<Base,piid,T,Copy> BaseClass;
11 STDMETHOD(Next)(ULONG celt,T *rgelt,ULONG *pceltFetched) {
12 if(IsBadWritePtr(rgelt,celt *sizeof(T))) return E_POINTER;
13 if((pceltFetched!=NULL) && IsBadWritePtr(pceltFetched,sizeof(ULONG))) return E_POINTER;
14 return BaseClass::Next(celt,rgelt,pceltFetched);
15 }
16 STDMETHOD(Clone)(Base **ppEnum) {
17 if(IsBadWritePtr(ppEnum,sizeof(Base *))) return E_POINTER;
18 return BaseClass::Clone(ppEnum);
19 }
20 BEGIN_COM_MAP(ThisClass)
21 COM_INTERFACE_ENTRY_IID(*piid,BaseClass)
22 COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal,m_pFTM)
23 END_COM_MAP()
24 DECLARE_GET_CONTROLLING_UNKNOWN()
25 HRESULT Init(T *begin,T *end,IUnknown *pUnk,CComEnumFlags flags = AtlFlagNoCopy) {
26 HRESULT hr;
27 IUnknown *pIU = GetControllingUnknown();
28 hr = CoCreateFreeThreadedMarshaler(pIU,& m_pFTM);
29 if(FAILED(hr)) return hr;
30 return BaseClass::Init(begin,end,pUnk,flags);
31 }
32 CSafeComEnum() { m_pFTM = NULL; }
33 void FinalRelease(void) {
34 if(m_pFTM) {
35 m_pFTM->Release();
36 }
37 CComObjectRootEx< ThreadModel >::FinalRelease();
38 }
39 protected:
40 IUnknown *m_pFTM;
41 };
42
43 #endif /* __cplusplus */
44
45 #endif
46