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)
18 CComObject<CObjectVector>* pVct = NULL;
20 if (FAILED(hr = CComObject<CObjectVector>::CreateInstance(&pVct))) {
24 if (FAILED(hr = pVct->QueryInterface(punkVal))) {
31 STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **punkVal)
38 CComObject<CObjectVector>* pVct = NULL;
40 if (FAILED(hr = CComObject<CObjectVector>::CreateInstance(&pVct))) {
43 if (FAILED(hr = pVct->QueryInterface(punkVal))) {
48 if (!m_vctVariant.empty()) {
49 //
\8ew
\92è
\88Ê
\92u
\82æ
\82è
\8ew
\92è
\90\94\82Ì
\95¡
\8eÊ
50 CComVariant varIdx, varCount;
52 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
56 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é
57 if (SUCCEEDED(varCount.ChangeType(VT_I4, &count))) {
58 nCount = varCount.lVal;
61 long mx = m_vctVariant.size();
62 if (nCount < 0 || nIdx + nCount >= mx) {
71 for (long i = 0; i < nCount; i++) {
72 pVct->m_vctVariant.push_back(m_vctVariant[nIdx + i]);
79 STDMETHODIMP CObjectVector::Clear()
81 //VARIANT
\82Ì
\83N
\83\8a\83A
\82Æ
\98A
\91z
\94z
\97ñ
\82Ì
\89ð
\95ú
82 VariantVector::iterator p = m_vctVariant.begin();
83 while (p != m_vctVariant.end()) {
91 STDMETHODIMP CObjectVector::Erase(VARIANT idx, VARIANT count)
93 //
\8ew
\92è
\88Ê
\92u
\82æ
\82è
\8ew
\92è
\90\94\82Ì
\8dí
\8f\9c
94 CComVariant varIdx, varCount;
96 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
101 if (SUCCEEDED(varCount.ChangeType(VT_I4, &count))) {
102 nCount = varCount.lVal;
105 long mx = m_vctVariant.size();
106 if (nCount < 0 || nIdx + nCount >= mx) {
109 if (nIdx < 0 || nIdx >= mx || nCount < 0) {
110 return DISP_E_BADINDEX;
113 m_vctVariant.erase(m_vctVariant.begin() + nIdx, m_vctVariant.begin() + nIdx + nCount);
117 STDMETHODIMP CObjectVector::Push(VARIANT newVal)
122 if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
126 //
\96\96\94ö
\82É
\92Ç
\89Á
127 m_vctVariant.push_back(tmp);
131 STDMETHODIMP CObjectVector::Pop(VARIANT *pVal)
133 //
\96\96\94ö
\82ð
\8eæ
\82è
\8fo
\82µ
135 if (!m_vctVariant.empty()) {
136 long mx = m_vctVariant.size();
138 ::VariantCopy(pVal, &m_vctVariant[mx - 1]);
139 m_vctVariant.pop_back();
144 STDMETHODIMP CObjectVector::Insert(VARIANT idx, VARIANT newVal)
146 //
\8ew
\92è
\88Ê
\92u
\82É
\91}
\93ü
149 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
153 long mx = m_vctVariant.size();
154 if (nIdx < 0 || nIdx >= mx) {
155 return DISP_E_BADINDEX;
161 if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
165 m_vctVariant.insert(m_vctVariant.begin() + nIdx, tmp);
169 STDMETHODIMP CObjectVector::get_Value(VARIANT idx, VARIANT *pVal)
175 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
180 return DISP_E_BADINDEX;
183 long mx = m_vctVariant.size();
185 //
\83x
\83N
\83^
\81[
\82Ì
\94Í
\88Í
\93à
\82È
\82ç
\92l
\82ð
\8eæ
\93¾
\82·
\82é
186 return ::VariantCopy(pVal, &m_vctVariant[nIdx]);
191 STDMETHODIMP CObjectVector::put_Value(VARIANT idx, VARIANT newVal)
195 if (SUCCEEDED(varIdx.ChangeType(VT_I4, &idx))) {
199 return DISP_E_BADINDEX;
202 long mx = m_vctVariant.size();
204 //
\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é
208 m_vctVariant.push_back(tmp);
216 if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
220 //
\83x
\83N
\83^
\81[
\82Ì
\94Í
\88Í
\93à
\82È
\82ç
\92l
\82ð
\8dÄ
\90Ý
\92è
\82·
\82é
221 if (FAILED(hr = ::VariantClear(&m_vctVariant.at(nIdx)))) {
225 return ::VariantCopy(&m_vctVariant.at(nIdx), &tmp);
228 STDMETHODIMP CObjectVector::get_Count(long *pVal)
230 *pVal = m_vctVariant.size();
234 STDMETHODIMP CObjectVector::get__NewEnum(IUnknown **pVal)
236 typedef CComEnumDynaVARIANT<CObjectVector> CComEnumDynaVector;
237 CComObject<CComEnumDynaVector>* pDyna = NULL;
239 if (FAILED(hr = CComObject<CComEnumDynaVector>::CreateInstance(&pDyna))) {
242 pDyna->Init(this, 0);
243 return pDyna->QueryInterface(IID_IEnumVARIANT, (void**)pVal);
246 STDMETHODIMP CObjectVector::Merge(VARIANT unkVal)
251 if (SUCCEEDED(varUnk.ChangeType(VT_UNKNOWN, &unkVal))) {
252 //
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8fê
\8d\87
253 CComPtr<IObjectVector> pVect;
254 if (FAILED(hr = varUnk.punkVal->QueryInterface(&pVect))) {
255 //
\8ew
\92è
\8aO
\82Ì
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Å
\82 \82é
260 pVect->get_Count(&mx);
263 for (i = 0; i < mx; i++) {
264 CComVariant idx((long)i);
267 pVect->get_Value(idx, &ret);
268 m_vctVariant.push_back(ret);
274 VARTYPE vt = VT_EMPTY;
275 SAFEARRAY* pArray = GetArrayFromVariant(unkVal, &vt);
276 if (!pArray || vt != VT_VARIANT) {
282 int dm = SafeArrayGetDim(pArray);
283 SafeArrayGetLBound(pArray, 1, &lb); //
\8d¶
\91¤
\82Ì
\93Y
\82¦
\8e\9a
284 SafeArrayGetUBound(pArray, 1, &ub);
285 if (dm == 1 && lb == 0 && vt == VT_VARIANT) {
286 // 1
\8e\9f\8c³
\94z
\97ñ
\82Å
\81A0
\83x
\81[
\83X
\82Ì
\83o
\83\8a\83A
\83\93\83g
\94z
\97ñ
\82Å
\82 \82é
289 for (cnt = 0; cnt <= ub; cnt++) {
290 // VARIANT
\82Ì
\94z
\97ñ
\82Å
\82 \82é
294 SafeArrayGetElement(pArray, dim, &tmp);
295 m_vctVariant.push_back(tmp);
296 }//next(
\94z
\97ñ
\82Ì
\83\8b\81[
\83v)
301 STDMETHODIMP CObjectVector::MakeArray(VARIANT *pVal)
303 long mx = m_vctVariant.size();
304 SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, mx);
306 return E_OUTOFMEMORY;
312 if (FAILED(hr = SafeArrayAccessData(pArray, (void**)&pvars))) {
313 SafeArrayDestroy(pArray);
318 for (cnt = 0; cnt < mx; cnt++) {
319 VariantInit(&pvars[cnt]);
320 VariantCopy(&pvars[cnt], &m_vctVariant.at(cnt));
322 SafeArrayUnaccessData(pArray);
324 pArray->fFeatures |= FADF_HAVEVARTYPE;
325 pVal->vt = VT_ARRAY | VT_VARIANT;
326 pVal->parray = pArray;