OSDN Git Service

セットアップの追加、ヘルプの修正
[seraphyscrtools/SeraphyScriptTools.git] / ObjectVector.cpp
index e40c083..d756f2e 100644 (file)
@@ -21,7 +21,11 @@ STDMETHODIMP CObjectVector::CreateVector(IUnknown **punkVal)
                return hr;
        }
 
-       return pVct->QueryInterface(punkVal);
+       if (FAILED(hr = pVct->QueryInterface(punkVal))) {
+               delete pVct;
+               return hr;
+       }
+       return S_OK;
 }
 
 STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **punkVal)
@@ -37,6 +41,7 @@ STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **pun
                return hr;
        }
        if (FAILED(hr = pVct->QueryInterface(punkVal))) {
+               delete pVct;
                return hr;
        }
 
@@ -111,8 +116,15 @@ STDMETHODIMP CObjectVector::Erase(VARIANT idx, VARIANT count)
 
 STDMETHODIMP CObjectVector::Push(VARIANT newVal)
 {
+       HRESULT hr;
+
+       CComVariant tmp;
+       if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
+               return hr;
+       }
+
        // \96\96\94ö\82É\92Ç\89Á
-       m_vctVariant.push_back(newVal);
+       m_vctVariant.push_back(tmp);
        return S_OK;
 }
 
@@ -143,7 +155,14 @@ STDMETHODIMP CObjectVector::Insert(VARIANT idx, VARIANT newVal)
                return DISP_E_BADINDEX;
        }
 
-       m_vctVariant.insert(m_vctVariant.begin() + nIdx, newVal);
+       HRESULT hr;
+
+       CComVariant tmp;
+       if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
+               return hr;
+       }
+
+       m_vctVariant.insert(m_vctVariant.begin() + nIdx, tmp);
        return S_OK;
 }
 
@@ -164,9 +183,9 @@ STDMETHODIMP CObjectVector::get_Value(VARIANT idx, VARIANT *pVal)
        long mx = m_vctVariant.size();
        if (nIdx < mx) {
                // \83x\83N\83^\81[\82Ì\94Í\88Í\93à\82È\82ç\92l\82ð\8eæ\93¾\82·\82é
-               ::VariantCopy(pVal, &m_vctVariant[nIdx]);
+               return ::VariantCopy(pVal, &m_vctVariant[nIdx]);
        }
-       return S_OK;
+       return S_FALSE;
 }
 
 STDMETHODIMP CObjectVector::put_Value(VARIANT idx, VARIANT newVal)
@@ -190,10 +209,20 @@ STDMETHODIMP CObjectVector::put_Value(VARIANT idx, VARIANT newVal)
                        mx++;
                }
        }
+
+       HRESULT hr;
+
+       CComVariant tmp;
+       if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
+               return hr;
+       }
+
        // \83x\83N\83^\81[\82Ì\94Í\88Í\93à\82È\82ç\92l\82ð\8dÄ\90Ý\92è\82·\82é
-       ::VariantClear(&m_vctVariant.at(nIdx));
-       ::VariantCopy(&m_vctVariant.at(nIdx), &newVal);
-       return S_OK;
+       if (FAILED(hr = ::VariantClear(&m_vctVariant.at(nIdx)))) {
+               return hr;
+       }
+
+       return ::VariantCopy(&m_vctVariant.at(nIdx), &tmp);
 }
 
 STDMETHODIMP CObjectVector::get_Count(long *pVal)
@@ -216,17 +245,20 @@ STDMETHODIMP CObjectVector::get__NewEnum(IUnknown **pVal)
 
 STDMETHODIMP CObjectVector::Merge(VARIANT unkVal)
 {
-       HRESULT ret = DISP_E_TYPEMISMATCH;
+       HRESULT hr;
+
        CComVariant varUnk;
        if (SUCCEEDED(varUnk.ChangeType(VT_UNKNOWN, &unkVal))) {
                // \83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8fê\8d\87
-               IObjectVector* pVect = NULL;
-               if (SUCCEEDED(varUnk.punkVal->QueryInterface(IID_IObjectVector, (void**)&pVect))) {
+               CComPtr<IObjectVector> pVect;
+               if (FAILED(hr = varUnk.punkVal->QueryInterface(&pVect))) {
                        // \8ew\92è\8aO\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\82Å\82 \82é
-                       return DISP_E_TYPEMISMATCH;
+                       return hr;
                }
+
                long mx;
                pVect->get_Count(&mx);
+
                long i;
                for (i = 0; i < mx; i++) {
                        CComVariant idx((long)i);
@@ -235,51 +267,60 @@ STDMETHODIMP CObjectVector::Merge(VARIANT unkVal)
                        pVect->get_Value(idx, &ret);
                        m_vctVariant.push_back(ret);
                }
-               pVect->Release();
-               ret = S_OK;
-       }
-       else {
-               VARTYPE vt = VT_EMPTY;
-               SAFEARRAY* pArray = GetArrayFromVariant(unkVal, &vt);
-               if (pArray && vt == VT_VARIANT) {
-                       long lb = 0;
-                       long ub = 0;
-                       int dm = SafeArrayGetDim(pArray);
-                       SafeArrayGetLBound(pArray, 1, &lb); // \8d\91¤\82Ì\93Y\82¦\8e\9a
-                       SafeArrayGetUBound(pArray, 1, &ub);
-                       if (dm == 1 && lb == 0 && vt == VT_VARIANT) {
-                               // 1\8e\9f\8c³\94z\97ñ\82Å\81A0\83x\81[\83X\82Ì\83o\83\8a\83A\83\93\83g\94z\97ñ\82Å\82 \82é
-                               int cnt;
-                               long dim[1];
-                               for (cnt = 0; cnt <= ub; cnt++) {
-                                       // VARIANT\82Ì\94z\97ñ\82Å\82 \82é
-                                       VARIANT tmp;
-                                       ::VariantInit(&tmp);
-                                       dim[0] = cnt;
-                                       SafeArrayGetElement(pArray, dim, &tmp);
-                                       m_vctVariant.push_back(tmp);
-                               }//next(\94z\97ñ\82Ì\83\8b\81[\83v)
-                               ret = S_OK;
-                       }
-               }
+               pVect.Release();
+               return S_OK;
        }
-       return ret;
-}
 
+       VARTYPE vt = VT_EMPTY;
+       SAFEARRAY* pArray = GetArrayFromVariant(unkVal, &vt);
+       if (!pArray || vt != VT_VARIANT) {
+               return S_FALSE;
+       }
+
+       long lb = 0;
+       long ub = 0;
+       int dm = SafeArrayGetDim(pArray);
+       SafeArrayGetLBound(pArray, 1, &lb); // \8d\91¤\82Ì\93Y\82¦\8e\9a
+       SafeArrayGetUBound(pArray, 1, &ub);
+       if (dm == 1 && lb == 0 && vt == VT_VARIANT) {
+               // 1\8e\9f\8c³\94z\97ñ\82Å\81A0\83x\81[\83X\82Ì\83o\83\8a\83A\83\93\83g\94z\97ñ\82Å\82 \82é
+               int cnt;
+               long dim[1];
+               for (cnt = 0; cnt <= ub; cnt++) {
+                       // VARIANT\82Ì\94z\97ñ\82Å\82 \82é
+                       VARIANT tmp;
+                       ::VariantInit(&tmp);
+                       dim[0] = cnt;
+                       SafeArrayGetElement(pArray, dim, &tmp);
+                       m_vctVariant.push_back(tmp);
+               }//next(\94z\97ñ\82Ì\83\8b\81[\83v)
+       }
+       return S_OK;
+}
 
 STDMETHODIMP CObjectVector::MakeArray(VARIANT *pVal)
 {
        long mx = m_vctVariant.size();
        SAFEARRAY* pArray = SafeArrayCreateVector(VT_VARIANT, 0, mx);
+       if (!pArray) {
+               return E_OUTOFMEMORY;
+       }
+
+       HRESULT hr;
+
        VARIANT* pvars;
-       if (SUCCEEDED(SafeArrayAccessData(pArray, (void**)&pvars))) {
-               long cnt = 0;
-               for (cnt = 0; cnt < mx; cnt++) {
-                       VariantInit(&pvars[cnt]);
-                       VariantCopy(&pvars[cnt], &m_vctVariant.at(cnt));
-               }
-               SafeArrayUnaccessData(pArray);
+       if (FAILED(hr = SafeArrayAccessData(pArray, (void**)&pvars))) {
+               SafeArrayDestroy(pArray);
+               return hr;
        }
+
+       long cnt = 0;
+       for (cnt = 0; cnt < mx; cnt++) {
+               VariantInit(&pvars[cnt]);
+               VariantCopy(&pvars[cnt], &m_vctVariant.at(cnt));
+       }
+       SafeArrayUnaccessData(pArray);
+
        pArray->fFeatures |= FADF_HAVEVARTYPE;
        pVal->vt = VT_ARRAY | VT_VARIANT;
        pVal->parray = pArray;