1 // ObjectVector.cpp : CObjectVector
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93
3 #include "SeraphyScriptTools.h"
4 #include "ObjectVector.h"
6 #include "CComEnumDynaVARIANT.h"
8 /////////////////////////////////////////////////////////////////////////////
11 STDMETHODIMP CObjectVector::CreateVector(IUnknown **punkVal)
14 CComObject<CObjectVector>* pVct = NULL;
15 if (SUCCEEDED(pVct->CreateInstance(&pVct))) {
16 pVct->QueryInterface(IID_IUnknown, (void**)punkVal);
21 STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **punkVal)
24 CComObject<CObjectVector>* pVct = NULL;
25 if (SUCCEEDED(pVct->CreateInstance(&pVct))) {
26 pVct->QueryInterface(IID_IUnknown, (void**)punkVal);
29 if (!m_vctVariant.empty()) {
30 //
\8ew
\92è
\88Ê
\92u
\82æ
\82è
\8ew
\92è
\90\94\82Ì
\95¡
\8eÊ
31 CComVariant varIdx, varCount;
33 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
37 long nCount = -1; // 0
\96¢
\96\9e\82ð
\8ew
\92è
\82·
\82é
\82Æ
\96\96\94ö
\82Ü
\82Å
\82Ì
\83J
\83E
\83\93\83g
\82ð
\8cv
\8eZ
\82·
\82é
38 if (SUCCEEDED(varCount.ChangeType(VT_I4, &count))) {
39 nCount = varCount.lVal;
42 long mx = m_vctVariant.size();
43 if (nCount < 0 || nIdx + nCount >= mx) {
53 for (i = 0; i < nCount; i++) {
56 ::VariantCopy(&tmp, &m_vctVariant.at(nIdx + i));
57 pVct->m_vctVariant.push_back(tmp);
64 STDMETHODIMP CObjectVector::Clear()
66 //VARIANT
\82Ì
\83N
\83\8a\83A
\82Æ
\98A
\91z
\94z
\97ñ
\82Ì
\89ð
\95ú
67 VariantVector::iterator p = m_vctVariant.begin();
68 while (p != m_vctVariant.end()) {
76 STDMETHODIMP CObjectVector::Erase(VARIANT idx, VARIANT count)
78 //
\8ew
\92è
\88Ê
\92u
\82æ
\82è
\8ew
\92è
\90\94\82Ì
\8dí
\8f\9c
79 CComVariant varIdx, varCount;
81 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
86 if (SUCCEEDED(varCount.ChangeType(VT_I4, &count))) {
87 nCount = varCount.lVal;
90 long mx = m_vctVariant.size();
91 if (nCount < 0 || nIdx + nCount >= mx) {
94 if (nIdx < 0 || nIdx >= mx || nCount < 0) {
95 return DISP_E_BADINDEX;
98 m_vctVariant.erase(m_vctVariant.begin() + nIdx, m_vctVariant.begin() + nIdx + nCount);
102 STDMETHODIMP CObjectVector::Push(VARIANT newVal)
104 //
\96\96\94ö
\82É
\92Ç
\89Á
107 ::VariantCopy(&tmp, &newVal);
108 m_vctVariant.push_back(tmp);
112 STDMETHODIMP CObjectVector::Pop(VARIANT *pVal)
114 //
\96\96\94ö
\82ð
\8eæ
\82è
\8fo
\82µ
116 if (!m_vctVariant.empty()) {
117 long mx = m_vctVariant.size();
119 ::VariantCopy(pVal, &m_vctVariant.at(mx - 1));
120 m_vctVariant.pop_back();
125 STDMETHODIMP CObjectVector::Insert(VARIANT idx, VARIANT newVal)
127 //
\8ew
\92è
\88Ê
\92u
\82É
\91}
\93ü
130 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
134 long mx = m_vctVariant.size();
135 if (nIdx < 0 || nIdx >= mx) {
136 return DISP_E_BADINDEX;
141 ::VariantCopy(&tmp, &newVal);
142 m_vctVariant.insert(m_vctVariant.begin() + nIdx, tmp);
146 STDMETHODIMP CObjectVector::get_Value(VARIANT idx, VARIANT *pVal)
152 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
157 return DISP_E_BADINDEX;
160 long mx = m_vctVariant.size();
162 //
\83x
\83N
\83^
\81[
\82Ì
\94Í
\88Í
\93à
\82È
\82ç
\92l
\82ð
\8eæ
\93¾
\82·
\82é
163 ::VariantCopy(pVal, &m_vctVariant.at(nIdx));
168 STDMETHODIMP CObjectVector::put_Value(VARIANT idx, VARIANT newVal)
172 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
176 return DISP_E_BADINDEX;
179 long mx = m_vctVariant.size();
181 //
\83x
\83N
\83^
\81[
\82Ì
\94Í
\88Í
\82ð
\92´
\82¦
\82Ä
\82¢
\82ê
\82Î
\8ag
\92£
\82µ
\81A
\8f\89\8aú
\89»
\82³
\82ê
\82½VARIANT
\82Å
\96\84\82ß
\82é
185 m_vctVariant.push_back(tmp);
189 //
\83x
\83N
\83^
\81[
\82Ì
\94Í
\88Í
\93à
\82È
\82ç
\92l
\82ð
\8dÄ
\90Ý
\92è
\82·
\82é
190 ::VariantClear(&m_vctVariant.at(nIdx));
191 ::VariantCopy(&m_vctVariant.at(nIdx), &newVal);
195 STDMETHODIMP CObjectVector::get_Count(long *pVal)
197 *pVal = m_vctVariant.size();
201 STDMETHODIMP CObjectVector::get__NewEnum(IUnknown **pVal)
203 typedef CComEnumDynaVARIANT<CObjectVector> CComEnumDynaVector;
204 CComObject<CComEnumDynaVector>* pDyna = NULL;
205 if (SUCCEEDED(pDyna->CreateInstance(&pDyna))) {
206 pDyna->Init(this, 0);
207 pDyna->QueryInterface(IID_IEnumVARIANT, (void**)pVal);
212 STDMETHODIMP CObjectVector::Merge(VARIANT unkVal)
214 HRESULT ret = DISP_E_TYPEMISMATCH;
216 if (SUCCEEDED(varUnk.ChangeType(VT_UNKNOWN, &unkVal))) {
217 //
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8fê
\8d\87
218 IObjectVector* pVect = NULL;
219 if (SUCCEEDED(varUnk.punkVal->QueryInterface(IID_IObjectVector, (void**)&pVect))) {
220 //
\8ew
\92è
\8aO
\82Ì
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Å
\82 \82é
221 return DISP_E_TYPEMISMATCH;
224 pVect->get_Count(&mx);
226 for (i = 0; i < mx; i++) {
227 CComVariant idx((long)i);
230 pVect->get_Value(idx, &ret);
231 m_vctVariant.push_back(ret);
237 VARTYPE vt = VT_EMPTY;
238 SAFEARRAY* pArray = GetArrayFromVariant(unkVal, &vt);
239 if (pArray && vt == VT_VARIANT) {
242 int dm = SafeArrayGetDim(pArray);
243 SafeArrayGetLBound(pArray, 1, &lb); //
\8d¶
\91¤
\82Ì
\93Y
\82¦
\8e\9a
244 SafeArrayGetUBound(pArray, 1, &ub);
245 if (dm == 1 && lb == 0 && vt == VT_VARIANT) {
246 // 1
\8e\9f\8c³
\94z
\97ñ
\82Å
\81A0
\83x
\81[
\83X
\82Ì
\83o
\83\8a\83A
\83\93\83g
\94z
\97ñ
\82Å
\82 \82é
249 for (cnt = 0; cnt <= ub; cnt++) {
250 // VARIANT
\82Ì
\94z
\97ñ
\82Å
\82 \82é
254 SafeArrayGetElement(pArray, dim, &tmp);
255 m_vctVariant.push_back(tmp);
256 }//next(
\94z
\97ñ
\82Ì
\83\8b\81[
\83v)
265 STDMETHODIMP CObjectVector::MakeArray(VARIANT *pVal)
267 long mx = m_vctVariant.size();
268 SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, mx);
270 if (SUCCEEDED(SafeArrayAccessData(pArray, (void**)&pvars))) {
272 for (cnt = 0; cnt < mx; cnt++) {
273 VariantInit(&pvars[cnt]);
274 VariantCopy(&pvars[cnt], &m_vctVariant.at(cnt));
276 SafeArrayUnaccessData(pArray);
278 pArray->fFeatures |= FADF_HAVEVARTYPE;
279 pVal->vt = VT_ARRAY | VT_VARIANT;
280 pVal->parray = pArray;