Mercurial > games > semicongine
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fuhtark_test/include/winapi/mspenum.h Wed Nov 26 21:36:48 2025 +0700 @@ -0,0 +1,46 @@ +#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 +
