Patch from Filipe Cabecinhas who said:

There were two bugs in my previous patch.  The first is that, when
  passing arguments by value that are represented by a pointer in a
  VARIANT, variantDataPointer was returning a pointer to the pointer.
  The second one is not allowing to create arrays of VARIANT (the
  behaviour we had by default before).

svn: r9771
This commit is contained in:
Eli Barzilay 2008-05-09 16:22:43 +00:00
parent 9f5e4a6dd9
commit 1ca628a1b8

View File

@ -264,7 +264,7 @@ void* variantDataPointer(VARTYPE vt,VARIANTARG *pVariantArg)
case VT_I1 | VT_BYREF : return &pVariantArg->pcVal; case VT_I1 | VT_BYREF : return &pVariantArg->pcVal;
case VT_UI1 : return &pVariantArg->bVal; case VT_UI1 : return &pVariantArg->bVal;
case VT_UI1 | VT_BYREF : return &pVariantArg->pbVal; case VT_UI1 | VT_BYREF : return &pVariantArg->pbVal;
case VT_I2 : return &(pVariantArg->iVal); case VT_I2 : return &pVariantArg->iVal;
case VT_I2 | VT_BYREF : return &pVariantArg->piVal; case VT_I2 | VT_BYREF : return &pVariantArg->piVal;
case VT_UI2 : return &pVariantArg->uiVal; case VT_UI2 : return &pVariantArg->uiVal;
case VT_UI2 | VT_BYREF : return &pVariantArg->puiVal; case VT_UI2 | VT_BYREF : return &pVariantArg->puiVal;
@ -287,7 +287,7 @@ void* variantDataPointer(VARTYPE vt,VARIANTARG *pVariantArg)
case VT_R4 | VT_BYREF : return &pVariantArg->pfltVal; case VT_R4 | VT_BYREF : return &pVariantArg->pfltVal;
case VT_R8 : return &pVariantArg->dblVal; case VT_R8 : return &pVariantArg->dblVal;
case VT_R8 | VT_BYREF : return &pVariantArg->pdblVal; case VT_R8 | VT_BYREF : return &pVariantArg->pdblVal;
case VT_BSTR : return &pVariantArg->bstrVal; case VT_BSTR : return pVariantArg->bstrVal;
case VT_BSTR | VT_BYREF : return &pVariantArg->pbstrVal; case VT_BSTR | VT_BYREF : return &pVariantArg->pbstrVal;
case VT_CY : return &pVariantArg->cyVal; case VT_CY : return &pVariantArg->cyVal;
case VT_CY | VT_BYREF : return &pVariantArg->pcyVal; case VT_CY | VT_BYREF : return &pVariantArg->pcyVal;
@ -297,7 +297,7 @@ void* variantDataPointer(VARTYPE vt,VARIANTARG *pVariantArg)
case VT_BOOL | VT_BYREF : return &pVariantArg->pboolVal; case VT_BOOL | VT_BYREF : return &pVariantArg->pboolVal;
case VT_ERROR : return &pVariantArg->scode; case VT_ERROR : return &pVariantArg->scode;
case VT_ERROR | VT_BYREF : return &pVariantArg->pscode; case VT_ERROR | VT_BYREF : return &pVariantArg->pscode;
case VT_DISPATCH : return &pVariantArg->pdispVal; case VT_DISPATCH : return pVariantArg->pdispVal;
case VT_DISPATCH | VT_BYREF : return &pVariantArg->ppdispVal; case VT_DISPATCH | VT_BYREF : return &pVariantArg->ppdispVal;
// VT_USERDEFINED | VT_BYREF indicates that we should pass the // VT_USERDEFINED | VT_BYREF indicates that we should pass the
// IUnknown pointer of a COM object. // IUnknown pointer of a COM object.
@ -305,7 +305,7 @@ void* variantDataPointer(VARTYPE vt,VARIANTARG *pVariantArg)
// bash it out to VT_UNKNOWN. // bash it out to VT_UNKNOWN.
case VT_USERDEFINED | VT_BYREF : return &pVariantArg->punkVal; case VT_USERDEFINED | VT_BYREF : return &pVariantArg->punkVal;
case VT_VARIANT | VT_BYREF : return &pVariantArg->pvarVal; case VT_VARIANT | VT_BYREF : return &pVariantArg->pvarVal;
case VT_UNKNOWN : return &pVariantArg->punkVal; case VT_UNKNOWN : return pVariantArg->punkVal;
case VT_UNKNOWN | VT_BYREF : return &pVariantArg->ppunkVal; case VT_UNKNOWN | VT_BYREF : return &pVariantArg->ppunkVal;
case VT_VARIANT : return pVariantArg; case VT_VARIANT : return pVariantArg;
case VT_PTR : case VT_PTR :
@ -366,9 +366,7 @@ void doSetArrayElts(Scheme_Object *vec, VARTYPE elementType, SAFEARRAY *theArray
elt = SCHEME_VEC_ELS(vec)[i]; elt = SCHEME_VEC_ELS(vec)[i];
currNdx[offset] = i; currNdx[offset] = i;
marshalSchemeValueToVariant(elt,&variant); marshalSchemeValueToVariant(elt,&variant);
// I don't think this will ever happen (at least when calling if (variant.vt != elementType && elementType != VT_VARIANT) {
// this function from the scheme side).
if (variant.vt != elementType) {
char errBuff[100]; char errBuff[100];
sprintf(errBuff, sprintf(errBuff,
"Unable to put an element of COM type 0x%x into an array of COM type 0x%x", "Unable to put an element of COM type 0x%x into an array of COM type 0x%x",