Mercurial > games > semicongine
diff fuhtark_test/include/winapi/mspcoll.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/mspcoll.h Wed Nov 26 21:36:48 2025 +0700 @@ -0,0 +1,177 @@ +#ifndef _MSPCOLL_H_ +#define _MSPCOLL_H_ + +template <class T> class CTapiIfCollection : public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModelNoCS> +{ +public: + typedef CTapiIfCollection<T> _CTapiCollectionBase; + BEGIN_COM_MAP(_CTapiCollectionBase) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(ITCollection) + END_COM_MAP() +private: + int m_nSize; + CComVariant *m_Var; + +public: + CTapiIfCollection(void) : m_nSize(0),m_Var(NULL) { } + HRESULT WINAPI Initialize(DWORD dwSize,T *pBegin,T *pEnd) { + int i; + HRESULT hr; + T *iter; + LOG((MSP_TRACE,"CTapiCollection::Initialize - enter")); + m_nSize = dwSize; + m_Var = new CComVariant[m_nSize]; + if(!m_Var) return E_OUTOFMEMORY; + i = 0; + for(iter = pBegin;iter!=pEnd;iter++) { + IDispatch *pDisp = NULL; + hr = (*iter)->QueryInterface(IID_IDispatch,(void**)&pDisp); + if(hr!=S_OK) return hr; + CComVariant& var = m_Var[i]; + VariantInit(&var); + var.vt = VT_DISPATCH; + var.pdispVal = pDisp; + i++; + } + LOG((MSP_TRACE,"CTapiCollection::Initialize - exit")); + return S_OK; + } + void FinalRelease() { + LOG((MSP_TRACE,"CTapiCollection::FinalRelease - enter")); + delete [] m_Var; + LOG((MSP_TRACE,"CTapiCollection::FinalRelease - exit")); + } + STDMETHOD(get_Count)(long *retval) { + HRESULT hr = S_OK; + LOG((MSP_TRACE,"CTapiCollection::get_Count - enter")); + try { + *retval = m_nSize; + } catch(...) { + hr = E_INVALIDARG; + } + LOG((MSP_TRACE,"CTapiCollection::get_Count - exit")); + return hr; + } + STDMETHOD(get_Item)(long Index,VARIANT *retval) { + HRESULT hr = S_OK; + LOG((MSP_TRACE,"CTapiCollection::get_Item - enter")); + if(!retval) return E_POINTER; + try { + VariantInit(retval); + } catch(...) { + hr = E_INVALIDARG; + } + if(hr!=S_OK) return hr; + retval->vt = VT_UNKNOWN; + retval->punkVal = NULL; + if((Index < 1) || (Index > m_nSize)) return E_INVALIDARG; + hr = VariantCopy(retval,&m_Var[Index-1]); + if(FAILED(hr)) { + LOG((MSP_ERROR,"CTapiCollection::get_Item - VariantCopy failed. hr = %lx",hr)); + return hr; + } + LOG((MSP_TRACE,"CTapiCollection::get_Item - exit")); + return S_OK; + } + HRESULT WINAPI get__NewEnum(IUnknown **retval) { + HRESULT hr; + LOG((MSP_TRACE,"CTapiCollection::new__Enum - enter")); + if(!retval) return E_POINTER; + *retval = NULL; + typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar; + enumvar *p; + hr = enumvar::CreateInstance(&p); + if(FAILED(hr)) return hr; + hr = p->Init(&m_Var[0],&m_Var[m_nSize],NULL,AtlFlagCopy); + if(SUCCEEDED(hr)) hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval); + if(FAILED(hr)) delete p; + LOG((MSP_TRACE,"CTapiCollection::new__Enum - exit")); + return hr; + } +}; + +class CTapiBstrCollection : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CMSPObjectSafetyImpl +{ +public: + BEGIN_COM_MAP(CTapiBstrCollection) + COM_INTERFACE_ENTRY(IDispatch) + COM_INTERFACE_ENTRY(ITCollection) + COM_INTERFACE_ENTRY(IObjectSafety) + END_COM_MAP() +private: + DWORD m_dwSize; + CComVariant *m_Var; +public: + CTapiBstrCollection(void) : m_dwSize(0),m_Var(NULL) { } + HRESULT WINAPI Initialize(DWORD dwSize,BSTR *pBegin,BSTR *pEnd) { + BSTR *i; + DWORD dw = 0; + LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - enter")); + m_dwSize = dwSize; + m_Var = new CComVariant[m_dwSize]; + if(!m_Var) return E_OUTOFMEMORY; + for(i = pBegin;i!=pEnd;i++) { + CComVariant& var = m_Var[dw]; + var.vt = VT_BSTR; + var.bstrVal = *i; + dw++; + } + LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - exit")); + return S_OK; + } + STDMETHOD(get_Count)(long *retval) { + HRESULT hr = S_OK; + LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - enter")); + try { + *retval = m_dwSize; + } catch(...) { + hr = E_INVALIDARG; + } + LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - exit")); + return hr; + } + STDMETHOD(get_Item)(long Index,VARIANT *retval) { + HRESULT hr = S_OK; + LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - enter")); + if(!retval) return E_POINTER; + try { + VariantInit(retval); + } catch(...) { + hr = E_INVALIDARG; + } + if(hr!=S_OK) return hr; + retval->vt = VT_BSTR; + retval->bstrVal = NULL; + if((Index < 1) || ((DWORD) Index > m_dwSize)) return E_INVALIDARG; + hr = VariantCopy(retval,&m_Var[Index-1]); + if(FAILED(hr)) { + LOG((MSP_ERROR,"CTapiBstrCollection::get_Item - VariantCopy failed. hr = %lx",hr)); + return hr; + } + LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - exit")); + return S_OK; + } + HRESULT WINAPI get__NewEnum(IUnknown **retval) { + HRESULT hr; + LOG((MSP_TRACE,"CTapiBstrCollection::get__NumEnum - enter")); + if(!retval) return E_POINTER; + *retval = NULL; + typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar; + enumvar *p = new enumvar; + if(!p) return E_OUTOFMEMORY; + hr = p->Init(&m_Var[0],&m_Var[m_dwSize],NULL,AtlFlagCopy); + if(SUCCEEDED(hr)) { + hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval); + } + if(FAILED(hr)) delete p; + LOG((MSP_TRACE,"CTapiBstrCollection::get__NewEnum - exit")); + return hr; + } + void FinalRelease() { + LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - enter")); + delete [] m_Var; + LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - exit")); + } +}; +#endif
