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:
Vadim Zeitlin
2007-12-22 15:22:16 +00:00
parent 07c0e08a26
commit 242019eef3

View File

@@ -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;
} }