OSDN Git Service

CLSIDの変更
[seraphyscrtools/SeraphyScriptTools.git] / ObjectVector.cpp
index 36931cc..d756f2e 100644 (file)
 
 STDMETHODIMP CObjectVector::CreateVector(IUnknown **punkVal)
 {
+       if (!punkVal) {
+               return E_POINTER;
+       }
        *punkVal = NULL;
+
        CComObject<CObjectVector>* pVct = NULL;
-       if (SUCCEEDED(pVct->CreateInstance(&pVct))) {
-               pVct->QueryInterface(IID_IUnknown, (void**)punkVal);
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CObjectVector>::CreateInstance(&pVct))) {
+               return hr;
+       }
+
+       if (FAILED(hr = pVct->QueryInterface(punkVal))) {
+               delete pVct;
+               return hr;
        }
        return S_OK;
 }
 
 STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **punkVal)
 {
+       if (!punkVal) {
+               return E_POINTER;
+       }
        *punkVal = NULL;
+
        CComObject<CObjectVector>* pVct = NULL;
-       if (SUCCEEDED(pVct->CreateInstance(&pVct))) {
-               pVct->QueryInterface(IID_IUnknown, (void**)punkVal);
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CObjectVector>::CreateInstance(&pVct))) {
+               return hr;
+       }
+       if (FAILED(hr = pVct->QueryInterface(punkVal))) {
+               delete pVct;
+               return hr;
        }
 
        if (!m_vctVariant.empty()) {
@@ -49,12 +68,8 @@ STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **pun
                }
 
                if (nIdx < mx) {
-                       long i;
-                       for (i = 0; i < nCount; i++) {
-                               VARIANT tmp;
-                               ::VariantInit(&tmp);
-                               ::VariantCopy(&tmp, &m_vctVariant.at(nIdx + i));
-                               pVct->m_vctVariant.push_back(tmp);
+                       for (long i = 0; i < nCount; i++) {
+                               pVct->m_vctVariant.push_back(m_vctVariant[nIdx + i]);
                        }
                }
        }
@@ -66,7 +81,7 @@ STDMETHODIMP CObjectVector::Clear()
        //VARIANT\82Ì\83N\83\8a\83A\82Æ\98A\91z\94z\97ñ\82Ì\89ð\95ú
        VariantVector::iterator p = m_vctVariant.begin();
        while (p != m_vctVariant.end()) {
-               ::VariantClear(&*p);
+               p->Clear();
                p++;
        }
        m_vctVariant.clear();
@@ -101,10 +116,14 @@ 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Á
-       VARIANT tmp;
-       ::VariantInit(&tmp);
-       ::VariantCopy(&tmp, &newVal);
        m_vctVariant.push_back(tmp);
        return S_OK;
 }
@@ -116,7 +135,7 @@ STDMETHODIMP CObjectVector::Pop(VARIANT *pVal)
        if (!m_vctVariant.empty()) {
                long mx = m_vctVariant.size();
                ::VariantInit(pVal);
-               ::VariantCopy(pVal, &m_vctVariant.at(mx - 1));
+               ::VariantCopy(pVal, &m_vctVariant[mx - 1]);
                m_vctVariant.pop_back();
        }
        return S_OK;
@@ -136,9 +155,13 @@ STDMETHODIMP CObjectVector::Insert(VARIANT idx, VARIANT newVal)
                return DISP_E_BADINDEX;
        }
 
-       VARIANT tmp;
-       ::VariantInit(&tmp);
-       ::VariantCopy(&tmp, &newVal);
+       HRESULT hr;
+
+       CComVariant tmp;
+       if (FAILED(hr = VariantCopyByVal(&tmp, &newVal))) {
+               return hr;
+       }
+
        m_vctVariant.insert(m_vctVariant.begin() + nIdx, tmp);
        return S_OK;
 }
@@ -160,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.at(nIdx));
+               return ::VariantCopy(pVal, &m_vctVariant[nIdx]);
        }
-       return S_OK;
+       return S_FALSE;
 }
 
 STDMETHODIMP CObjectVector::put_Value(VARIANT idx, VARIANT newVal)
@@ -186,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)
@@ -202,26 +235,30 @@ STDMETHODIMP CObjectVector::get__NewEnum(IUnknown **pVal)
 {
        typedef CComEnumDynaVARIANT<CObjectVector> CComEnumDynaVector;
        CComObject<CComEnumDynaVector>* pDyna = NULL;
-       if (SUCCEEDED(pDyna->CreateInstance(&pDyna))) {
-               pDyna->Init(this, 0);
-               pDyna->QueryInterface(IID_IEnumVARIANT, (void**)pVal);
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CComEnumDynaVector>::CreateInstance(&pDyna))) {
+               return hr;
        }
-       return S_OK;
+       pDyna->Init(this, 0);
+       return pDyna->QueryInterface(IID_IEnumVARIANT, (void**)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);
@@ -230,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;