This allows to call COM methods taking arrays of strings easily.
Also remove support for the old and non-existent any more "stringlist" variant
type.
And add more error checking.
Closes #14296.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71437
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
oleVariant.vt = VT_DISPATCH;
oleVariant.pdispVal = (IDispatch*) variant.GetVoidPtr();
}
oleVariant.vt = VT_DISPATCH;
oleVariant.pdispVal = (IDispatch*) variant.GetVoidPtr();
}
- else if (type == wxT("list") || type == wxT("stringlist"))
+ else if (type == wxT("list") || type == wxT("arrstring"))
- oleVariant.vt = VT_VARIANT | VT_ARRAY;
-
SAFEARRAY *psa;
SAFEARRAYBOUND saBound;
SAFEARRAY *psa;
SAFEARRAYBOUND saBound;
- VARIANTARG *pvargBase;
- VARIANTARG *pvarg;
- int i, j;
+ bool isArrString = type == wxT("arrstring");
+ wxArrayString strings;
- int iCount = variant.GetCount();
+ if (isArrString)
+ strings = variant.GetArrayString();
+ oleVariant.vt = (isArrString ? VT_BSTR : VT_VARIANT) | VT_ARRAY;
+ long lCount = isArrString ? strings.GetCount() : variant.GetCount();
- saBound.cElements = iCount;
-
- psa = SafeArrayCreate(VT_VARIANT, 1, &saBound);
+ saBound.cElements = lCount;
+ psa = SafeArrayCreate(isArrString ? VT_BSTR : VT_VARIANT, 1, &saBound);
if (psa == NULL)
return false;
if (psa == NULL)
return false;
- SafeArrayAccessData(psa, (void**)&pvargBase);
-
- pvarg = pvargBase;
- for (i = 0; i < iCount; i++)
+ long i;
+ for (i = 0; i < lCount; i++)
- // copy each string in the list of strings
- wxVariant eachVariant(variant[i]);
- if (!wxConvertVariantToOle(eachVariant, * pvarg))
- // memory failure: back out and free strings alloc'ed up to
- // now, and then the array itself.
- pvarg = pvargBase;
- for (j = 0; j < i; j++)
+ wxBasicString bstr(strings[i]);
+ if ( !bstr && !strings[i].empty() )
- SysFreeString(pvarg->bstrVal);
- pvarg++;
+ // BSTR can be NULL for empty strings but if the string was
+ // not empty, it means we failed to allocate memory for it.
+ break;
- SafeArrayDestroy(psa);
- return false;
+
+ if ( FAILED(SafeArrayPutElement(psa, &i, (BSTR)bstr)) )
+ break;
+ }
+ else // list of wxVariants
+ {
+ VARIANT v;
+ if ( !wxConvertVariantToOle(variant[i], v) )
+ break;
+
+ HRESULT hr = SafeArrayPutElement(psa, &i, &v);
+
+ // SafeArrayPutElement makes a copy of an added element, so
+ // free this one.
+ VariantClear(&v);
+
+ if (FAILED(hr))
+ break;
- SafeArrayUnaccessData(psa);
+ if (i < lCount) // the iteration was exited prematurely because of an error
+ {
+ SafeArrayDestroy(psa);
+ return false;
+ }
oleVariant.parray = psa;
}
oleVariant.parray = psa;
}