Add support for wxArrayString to wxVariant-to-OLE conversion.

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
This commit is contained in:
Vadim Zeitlin
2012-05-15 10:04:03 +00:00
parent 96c9640205
commit 82c372a7e2

View File

@@ -199,49 +199,62 @@ WXDLLEXPORT bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& ole
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;
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.lLbound = 0;
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;
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))
if (isArrString)
{
// 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;
}
pvarg++;
}
SafeArrayUnaccessData(psa);
if (i < lCount) // the iteration was exited prematurely because of an error
{
SafeArrayDestroy(psa);
return false;
}
oleVariant.parray = psa;
}