add BSTR arrays handling in wxConvertOleToVariant() (#9636)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54956 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -677,7 +677,6 @@ wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant)
|
|||||||
bool ok = true;
|
bool ok = true;
|
||||||
if ( oleVariant.vt & VT_ARRAY )
|
if ( oleVariant.vt & VT_ARRAY )
|
||||||
{
|
{
|
||||||
variant.ClearList();
|
|
||||||
|
|
||||||
// Compute the total number of elements in all array dimensions
|
// Compute the total number of elements in all array dimensions
|
||||||
int cElements = 1;
|
int cElements = 1;
|
||||||
@@ -685,23 +684,53 @@ wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant)
|
|||||||
cElements *= oleVariant.parray->rgsabound[cDims].cElements;
|
cElements *= oleVariant.parray->rgsabound[cDims].cElements;
|
||||||
|
|
||||||
// Get a pointer to the data
|
// Get a pointer to the data
|
||||||
VARIANTARG* pvdata;
|
void* pvdata;
|
||||||
HRESULT hr = SafeArrayAccessData(oleVariant.parray, (void **)&pvdata);
|
HRESULT hr = SafeArrayAccessData(oleVariant.parray, &pvdata);
|
||||||
if ( FAILED(hr) )
|
if ( FAILED(hr) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for ( int i = 0; i < cElements; i++ )
|
switch (oleVariant.vt & VT_TYPEMASK)
|
||||||
{
|
{
|
||||||
VARIANTARG& oleElement = pvdata[i];
|
case VT_VARIANT:
|
||||||
wxVariant vElement;
|
{
|
||||||
if ( !wxConvertOleToVariant(oleElement, vElement) )
|
variant.ClearList();
|
||||||
{
|
VARIANTARG *variant_data=(VARIANTARG*)pvdata;
|
||||||
ok = false;
|
for ( int i = 0; i < cElements; i++ )
|
||||||
variant.ClearList();
|
{
|
||||||
break;
|
VARIANTARG& oleElement = variant_data[i];
|
||||||
}
|
wxVariant vElement;
|
||||||
|
if ( !wxConvertOleToVariant(oleElement, vElement) )
|
||||||
|
{
|
||||||
|
ok = false;
|
||||||
|
variant.ClearList();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
variant.Append(vElement);
|
variant.Append(vElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VT_BSTR:
|
||||||
|
{
|
||||||
|
wxArrayString strings;
|
||||||
|
BSTR *string_val=(BSTR*)pvdata;
|
||||||
|
for ( int i = 0; i < cElements; ++i )
|
||||||
|
{
|
||||||
|
wxString str=wxConvertStringFromOle(*string_val);
|
||||||
|
strings.Add(str);
|
||||||
|
++string_val;
|
||||||
|
}
|
||||||
|
variant=strings;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
wxLogDebug(_T("unhandled VT_ARRAY type %x in wxConvertOleToVariant"),
|
||||||
|
oleVariant.vt & VT_TYPEMASK);
|
||||||
|
variant = wxVariant();
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SafeArrayUnaccessData(oleVariant.parray);
|
SafeArrayUnaccessData(oleVariant.parray);
|
||||||
@@ -719,23 +748,25 @@ wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant)
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: [as yet] unhandled reference %X"),oleVariant.vt);
|
wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: [as yet] unhandled reference %X"),
|
||||||
|
oleVariant.vt);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // simply type (not array or reference)
|
else // simply type (not array or reference)
|
||||||
{
|
{
|
||||||
switch (oleVariant.vt & VT_TYPEMASK)
|
switch ( oleVariant.vt & VT_TYPEMASK )
|
||||||
{
|
{
|
||||||
case VT_BSTR:
|
case VT_BSTR:
|
||||||
{
|
{
|
||||||
wxString str(wxConvertStringFromOle(oleVariant.bstrVal));
|
wxString str(wxConvertStringFromOle(oleVariant.bstrVal));
|
||||||
variant = str;
|
variant = str;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case VT_DATE:
|
case VT_DATE:
|
||||||
{
|
|
||||||
#if wxUSE_DATETIME
|
#if wxUSE_DATETIME
|
||||||
|
{
|
||||||
unsigned short dosDate = 0;
|
unsigned short dosDate = 0;
|
||||||
unsigned short dosTime = 0;
|
unsigned short dosTime = 0;
|
||||||
VariantTimeToDosDateTime(oleVariant.date, & dosDate, & dosTime);
|
VariantTimeToDosDateTime(oleVariant.date, & dosDate, & dosTime);
|
||||||
@@ -744,61 +775,41 @@ wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant)
|
|||||||
wxDateTime date;
|
wxDateTime date;
|
||||||
date.SetFromDOS(dosDateTime);
|
date.SetFromDOS(dosDateTime);
|
||||||
variant = date;
|
variant = date;
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
#endif // wxUSE_DATETIME
|
||||||
|
break;
|
||||||
|
|
||||||
case VT_I4:
|
case VT_I4:
|
||||||
{
|
variant = (long) oleVariant.lVal;
|
||||||
variant = (long) oleVariant.lVal;
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VT_I2:
|
case VT_I2:
|
||||||
{
|
variant = (long) oleVariant.iVal;
|
||||||
variant = (long) oleVariant.iVal;
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case VT_BOOL:
|
case VT_BOOL:
|
||||||
{
|
variant = oleVariant.boolVal != 0;
|
||||||
#if (defined(_MSC_VER) && (_MSC_VER <= 1000) && !defined(__MWERKS__) ) //GC
|
break;
|
||||||
#ifndef HAVE_BOOL // Can't use bool operator if no native bool type
|
|
||||||
variant = (long) (oleVariant.bool != 0);
|
|
||||||
#else
|
|
||||||
variant = (bool) (oleVariant.bool != 0);
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#ifndef HAVE_BOOL // Can't use bool operator if no native bool type
|
|
||||||
variant = (long) (oleVariant.boolVal != 0);
|
|
||||||
#else
|
|
||||||
variant = (bool) (oleVariant.boolVal != 0);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VT_R8:
|
case VT_R8:
|
||||||
{
|
variant = oleVariant.dblVal;
|
||||||
variant = oleVariant.dblVal;
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VT_DISPATCH:
|
case VT_DISPATCH:
|
||||||
{
|
variant = (void*) oleVariant.pdispVal;
|
||||||
variant = (void*) oleVariant.pdispVal;
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VT_NULL:
|
case VT_NULL:
|
||||||
{
|
variant.MakeNull();
|
||||||
variant.MakeNull();
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VT_EMPTY:
|
case VT_EMPTY:
|
||||||
{
|
break; // Ignore Empty Variant, used only during destruction of objects
|
||||||
break; // Ignore Empty Variant, used only during destruction of objects
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
{
|
wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: Unknown variant value type %X -> %X"),
|
||||||
wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: Unknown variant value type %X -> %X"),oleVariant.vt,oleVariant.vt&VT_TYPEMASK);
|
oleVariant.vt,oleVariant.vt&VT_TYPEMASK);
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user