diff --git a/dlls/oleaut32/oleaut32.spec b/dlls/oleaut32/oleaut32.spec index 87563c70637..8bbb2ea7217 100644 --- a/dlls/oleaut32/oleaut32.spec +++ b/dlls/oleaut32/oleaut32.spec @@ -101,6 +101,7 @@ debug_channels (ole typelib) 94 stdcall VarDateFromStr(wstr long long ptr) VarDateFromStr 95 stub VarDateFromDisp 96 stdcall VarDateFromBool(long ptr) VarDateFromBool +#97 stub VarFormatDateTime # (ptr long long ptr) 98 stdcall VarCyFromUI1(long ptr) VarCyFromUI1 99 stdcall VarCyFromI2(long ptr) VarCyFromI2 100 stdcall VarCyFromI4(long ptr) VarCyFromI4 @@ -308,7 +309,7 @@ debug_channels (ole typelib) 426 stub GetRecordInfoFromGuids # stdcall (ptr long long long ptr ptr) 427 stub GetRecordInfoFromTypeInfo # stdcall (ptr ptr) 428 stub OleLoadPictureFileEx -429 stub SafeArrayAllocDescriptorEx +429 stdcall SafeArrayAllocDescriptorEx(long long ptr) SafeArrayAllocDescriptorEx 430 stub SafeArrayCreateEx 431 stub SafeArrayCreateVectorEx 432 stub SafeArrayGetIID @@ -320,7 +321,7 @@ debug_channels (ole typelib) 438 stub VarAnd # stdcall (ptr ptr ptr) 439 stdcall VarBstrCat(ptr ptr ptr) VarBstrCat 440 stdcall VarBstrCmp(ptr ptr long long) VarBstrCmp -441 stub VarCat # stdcall (ptr ptr ptr) +441 stdcall VarCat(ptr ptr ptr) VarCat 442 stub VarCmp # stdcall (ptr ptr long long) 443 stub VarCyAbs 444 stub VarCyAdd diff --git a/dlls/oleaut32/safearray.c b/dlls/oleaut32/safearray.c index 323385180fd..d5c87559ab3 100644 --- a/dlls/oleaut32/safearray.c +++ b/dlls/oleaut32/safearray.c @@ -20,7 +20,7 @@ DEFAULT_DEBUG_CHANNEL(ole); #define SYSDUPSTRING(str) SysAllocStringLen((str), SysStringLen(str)) -/* Localy used methods */ +/* Locally used methods */ static INT endOfDim(LONG *coor, SAFEARRAYBOUND *mat, LONG dim, LONG realDim); @@ -101,7 +101,7 @@ VARTYPE_NOT_SUPPORTED, /* VT_ARRAY [V] SAFEARRAY* */ VARTYPE_NOT_SUPPORTED /* VT_BYREF [V] void* for local use */ }; -static const int LAST_VARTYPE = sizeof(VARTYPE_SIZE)/sizeof(ULONG); +static const int LAST_VARTYPE = sizeof(VARTYPE_SIZE)/sizeof(VARTYPE_SIZE[0]); /************************************************************************* @@ -129,6 +129,26 @@ HRESULT WINAPI SafeArrayAllocDescriptor( return(S_OK); } +/************************************************************************* + * SafeArrayAllocDescriptorEx (OLEAUT32.429) + * Allocate the appropriate amount of memory for the SafeArray descriptor + * + * This is a minimal implementation just to get things moving. + * + * The MSDN documentation on this doesn't tell us much. + */ +HRESULT WINAPI SafeArrayAllocDescriptorEx( + VARTYPE vt, + UINT cDims, + SAFEARRAY **ppsaOut) +{ + if ( (vt >= LAST_VARTYPE) || + ( VARTYPE_SIZE[vt] == VARTYPE_NOT_SUPPORTED ) ) + return E_UNEXPECTED; + + return SafeArrayAllocDescriptor (cDims, ppsaOut); +} + /************************************************************************* * SafeArrayAllocData (OLEAUT32.37) * Allocate the appropriate amount of data for the SafeArray data @@ -516,6 +536,10 @@ HRESULT WINAPI SafeArrayPtrOfIndex( if(! validCoordinate(rgIndices, psa)) return DISP_E_BADINDEX; + /* Although it is dangerous to do this without having a lock, it is not + * illegal. Microsoft do warn of the danger. + */ + /* Figure out the number of items to skip */ stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims); diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 6f84d0a84bd..05150e9deec 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -4650,3 +4650,26 @@ HRESULT WINAPI VarBstrCat(BSTR left, BSTR right, BSTR *out) return 1; } +/********************************************************************** + * VarCat [OLEAUT32.441] + */ +HRESULT WINAPI VarCat(LPVARIANT left, LPVARIANT right, LPVARIANT out) +{ + /* Should we VariantClear out? */ + /* Can we handle array, vector, by ref etc. */ + if ((V_VT(left)&VT_TYPEMASK) == VT_NULL && + (V_VT(right)&VT_TYPEMASK) == VT_NULL) + { + V_VT(out) = VT_NULL; + return S_OK; + } + else if (V_VT(left) == VT_BSTR && V_VT(right) == VT_BSTR) + { + V_VT(out) = VT_BSTR; + VarBstrCat (V_BSTR(left), V_BSTR(right), &V_BSTR(out)); + return S_OK; + } + else + FIXME ("types not supported\n"); + return S_OK; +}