handle VT_ARRAY/VT_BYREF VARIANTs in wxConvertOleToVariant() (patch 1845897)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50899 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -671,7 +671,59 @@ WXDLLEXPORT bool wxConvertVariantToOle(const wxVariant& variant, VARIANTARG& ole
|
|||||||
#define VT_TYPEMASK 0xfff
|
#define VT_TYPEMASK 0xfff
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
WXDLLEXPORT bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant)
|
WXDLLEXPORT bool
|
||||||
|
wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant)
|
||||||
|
{
|
||||||
|
if ( oleVariant.vt & VT_ARRAY )
|
||||||
|
{
|
||||||
|
variant.ClearList();
|
||||||
|
|
||||||
|
// Compute the total number of elements in all array dimensions
|
||||||
|
int cElements = 1;
|
||||||
|
for ( int cDims = 0; cDims < oleVariant.parray->cDims; cDims++ )
|
||||||
|
cElements *= oleVariant.parray->rgsabound[cDims].cElements;
|
||||||
|
|
||||||
|
// Get a pointer to the data
|
||||||
|
VARIANTARG* pvdata;
|
||||||
|
HRESULT hr = SafeArrayAccessData(oleVariant.parray, (void **)&pvdata);
|
||||||
|
if ( FAILED(hr) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool ok = true;
|
||||||
|
for ( int i = 0; i < cElements; i++ )
|
||||||
|
{
|
||||||
|
VARIANTARG& oleElement = pvdata[i];
|
||||||
|
wxVariant vElement;
|
||||||
|
if ( !wxConvertOleToVariant(oleElement, vElement) )
|
||||||
|
{
|
||||||
|
ok = false;
|
||||||
|
variant.ClearList();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
variant.Append(vElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
SafeArrayUnaccessData(oleVariant.parray);
|
||||||
|
}
|
||||||
|
else if ( oleVariant.vt & VT_BYREF )
|
||||||
|
{
|
||||||
|
switch ( oleVariant.vt & VT_TYPEMASK )
|
||||||
|
{
|
||||||
|
case VT_VARIANT:
|
||||||
|
{
|
||||||
|
VARIANTARG& oleReference = *((LPVARIANT)oleVariant.byref);
|
||||||
|
if (!wxConvertOleToVariant(oleReference,variant))
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: [as yet] unhandled reference %X"),oleVariant.vt);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // simply type (not array or reference)
|
||||||
{
|
{
|
||||||
switch (oleVariant.vt & VT_TYPEMASK)
|
switch (oleVariant.vt & VT_TYPEMASK)
|
||||||
{
|
{
|
||||||
@@ -728,35 +780,6 @@ WXDLLEXPORT bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant&
|
|||||||
variant = oleVariant.dblVal;
|
variant = oleVariant.dblVal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VT_ARRAY:
|
|
||||||
{
|
|
||||||
variant.ClearList();
|
|
||||||
|
|
||||||
int cDims, cElements, i;
|
|
||||||
VARIANTARG* pvdata;
|
|
||||||
|
|
||||||
// Iterate the dimensions: number of elements is x*y*z
|
|
||||||
for (cDims = 0, cElements = 1;
|
|
||||||
cDims < oleVariant.parray->cDims; cDims ++)
|
|
||||||
cElements *= oleVariant.parray->rgsabound[cDims].cElements;
|
|
||||||
|
|
||||||
// Get a pointer to the data
|
|
||||||
HRESULT hr = SafeArrayAccessData(oleVariant.parray, (void HUGEP* FAR*) & pvdata);
|
|
||||||
if (hr != NOERROR)
|
|
||||||
return false;
|
|
||||||
// Iterate the data.
|
|
||||||
for (i = 0; i < cElements; i++)
|
|
||||||
{
|
|
||||||
VARIANTARG& oleElement = pvdata[i];
|
|
||||||
wxVariant vElement;
|
|
||||||
if (!wxConvertOleToVariant(oleElement, vElement))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
variant.Append(vElement);
|
|
||||||
}
|
|
||||||
SafeArrayUnaccessData(oleVariant.parray);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case VT_DISPATCH:
|
case VT_DISPATCH:
|
||||||
{
|
{
|
||||||
variant = (void*) oleVariant.pdispVal;
|
variant = (void*) oleVariant.pdispVal;
|
||||||
@@ -773,10 +796,12 @@ WXDLLEXPORT bool wxConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant&
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: Unknown variant value type"));
|
wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: Unknown variant value type %X -> %X"),oleVariant.vt,oleVariant.vt&VT_TYPEMASK);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user