comparison 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
comparison
equal deleted inserted replaced
1499:1f58458b7ef7 1500:91c8c3b7cbf0
1 #ifndef _MSPCOLL_H_
2 #define _MSPCOLL_H_
3
4 template <class T> class CTapiIfCollection : public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModelNoCS>
5 {
6 public:
7 typedef CTapiIfCollection<T> _CTapiCollectionBase;
8 BEGIN_COM_MAP(_CTapiCollectionBase)
9 COM_INTERFACE_ENTRY(IDispatch)
10 COM_INTERFACE_ENTRY(ITCollection)
11 END_COM_MAP()
12 private:
13 int m_nSize;
14 CComVariant *m_Var;
15
16 public:
17 CTapiIfCollection(void) : m_nSize(0),m_Var(NULL) { }
18 HRESULT WINAPI Initialize(DWORD dwSize,T *pBegin,T *pEnd) {
19 int i;
20 HRESULT hr;
21 T *iter;
22 LOG((MSP_TRACE,"CTapiCollection::Initialize - enter"));
23 m_nSize = dwSize;
24 m_Var = new CComVariant[m_nSize];
25 if(!m_Var) return E_OUTOFMEMORY;
26 i = 0;
27 for(iter = pBegin;iter!=pEnd;iter++) {
28 IDispatch *pDisp = NULL;
29 hr = (*iter)->QueryInterface(IID_IDispatch,(void**)&pDisp);
30 if(hr!=S_OK) return hr;
31 CComVariant& var = m_Var[i];
32 VariantInit(&var);
33 var.vt = VT_DISPATCH;
34 var.pdispVal = pDisp;
35 i++;
36 }
37 LOG((MSP_TRACE,"CTapiCollection::Initialize - exit"));
38 return S_OK;
39 }
40 void FinalRelease() {
41 LOG((MSP_TRACE,"CTapiCollection::FinalRelease - enter"));
42 delete [] m_Var;
43 LOG((MSP_TRACE,"CTapiCollection::FinalRelease - exit"));
44 }
45 STDMETHOD(get_Count)(long *retval) {
46 HRESULT hr = S_OK;
47 LOG((MSP_TRACE,"CTapiCollection::get_Count - enter"));
48 try {
49 *retval = m_nSize;
50 } catch(...) {
51 hr = E_INVALIDARG;
52 }
53 LOG((MSP_TRACE,"CTapiCollection::get_Count - exit"));
54 return hr;
55 }
56 STDMETHOD(get_Item)(long Index,VARIANT *retval) {
57 HRESULT hr = S_OK;
58 LOG((MSP_TRACE,"CTapiCollection::get_Item - enter"));
59 if(!retval) return E_POINTER;
60 try {
61 VariantInit(retval);
62 } catch(...) {
63 hr = E_INVALIDARG;
64 }
65 if(hr!=S_OK) return hr;
66 retval->vt = VT_UNKNOWN;
67 retval->punkVal = NULL;
68 if((Index < 1) || (Index > m_nSize)) return E_INVALIDARG;
69 hr = VariantCopy(retval,&m_Var[Index-1]);
70 if(FAILED(hr)) {
71 LOG((MSP_ERROR,"CTapiCollection::get_Item - VariantCopy failed. hr = %lx",hr));
72 return hr;
73 }
74 LOG((MSP_TRACE,"CTapiCollection::get_Item - exit"));
75 return S_OK;
76 }
77 HRESULT WINAPI get__NewEnum(IUnknown **retval) {
78 HRESULT hr;
79 LOG((MSP_TRACE,"CTapiCollection::new__Enum - enter"));
80 if(!retval) return E_POINTER;
81 *retval = NULL;
82 typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
83 enumvar *p;
84 hr = enumvar::CreateInstance(&p);
85 if(FAILED(hr)) return hr;
86 hr = p->Init(&m_Var[0],&m_Var[m_nSize],NULL,AtlFlagCopy);
87 if(SUCCEEDED(hr)) hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
88 if(FAILED(hr)) delete p;
89 LOG((MSP_TRACE,"CTapiCollection::new__Enum - exit"));
90 return hr;
91 }
92 };
93
94 class CTapiBstrCollection : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CMSPObjectSafetyImpl
95 {
96 public:
97 BEGIN_COM_MAP(CTapiBstrCollection)
98 COM_INTERFACE_ENTRY(IDispatch)
99 COM_INTERFACE_ENTRY(ITCollection)
100 COM_INTERFACE_ENTRY(IObjectSafety)
101 END_COM_MAP()
102 private:
103 DWORD m_dwSize;
104 CComVariant *m_Var;
105 public:
106 CTapiBstrCollection(void) : m_dwSize(0),m_Var(NULL) { }
107 HRESULT WINAPI Initialize(DWORD dwSize,BSTR *pBegin,BSTR *pEnd) {
108 BSTR *i;
109 DWORD dw = 0;
110 LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - enter"));
111 m_dwSize = dwSize;
112 m_Var = new CComVariant[m_dwSize];
113 if(!m_Var) return E_OUTOFMEMORY;
114 for(i = pBegin;i!=pEnd;i++) {
115 CComVariant& var = m_Var[dw];
116 var.vt = VT_BSTR;
117 var.bstrVal = *i;
118 dw++;
119 }
120 LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - exit"));
121 return S_OK;
122 }
123 STDMETHOD(get_Count)(long *retval) {
124 HRESULT hr = S_OK;
125 LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - enter"));
126 try {
127 *retval = m_dwSize;
128 } catch(...) {
129 hr = E_INVALIDARG;
130 }
131 LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - exit"));
132 return hr;
133 }
134 STDMETHOD(get_Item)(long Index,VARIANT *retval) {
135 HRESULT hr = S_OK;
136 LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - enter"));
137 if(!retval) return E_POINTER;
138 try {
139 VariantInit(retval);
140 } catch(...) {
141 hr = E_INVALIDARG;
142 }
143 if(hr!=S_OK) return hr;
144 retval->vt = VT_BSTR;
145 retval->bstrVal = NULL;
146 if((Index < 1) || ((DWORD) Index > m_dwSize)) return E_INVALIDARG;
147 hr = VariantCopy(retval,&m_Var[Index-1]);
148 if(FAILED(hr)) {
149 LOG((MSP_ERROR,"CTapiBstrCollection::get_Item - VariantCopy failed. hr = %lx",hr));
150 return hr;
151 }
152 LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - exit"));
153 return S_OK;
154 }
155 HRESULT WINAPI get__NewEnum(IUnknown **retval) {
156 HRESULT hr;
157 LOG((MSP_TRACE,"CTapiBstrCollection::get__NumEnum - enter"));
158 if(!retval) return E_POINTER;
159 *retval = NULL;
160 typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
161 enumvar *p = new enumvar;
162 if(!p) return E_OUTOFMEMORY;
163 hr = p->Init(&m_Var[0],&m_Var[m_dwSize],NULL,AtlFlagCopy);
164 if(SUCCEEDED(hr)) {
165 hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
166 }
167 if(FAILED(hr)) delete p;
168 LOG((MSP_TRACE,"CTapiBstrCollection::get__NewEnum - exit"));
169 return hr;
170 }
171 void FinalRelease() {
172 LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - enter"));
173 delete [] m_Var;
174 LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - exit"));
175 }
176 };
177 #endif