Bill Medland (medbi01@accpac.com) A couple of additions to oleaut32. Index: wine/dlls/oleaut32/oleaut32.spec =================================================================== RCS file: /home/wine/wine/dlls/oleaut32/oleaut32.spec,v retrieving revision 1.33 diff -u -r1.33 oleaut32.spec --- wine/dlls/oleaut32/oleaut32.spec 2001/10/23 19:59:24 1.33 +++ wine/dlls/oleaut32/oleaut32.spec 2002/01/24 14:48:38 @@ -101,6 +101,7 @@ 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 @@ 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 @@ 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 Index: wine/dlls/oleaut32/variant.c =================================================================== RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v retrieving revision 1.30 diff -u -r1.30 variant.c --- wine/dlls/oleaut32/variant.c 2002/01/02 21:44:30 1.30 +++ wine/dlls/oleaut32/variant.c 2002/01/24 14:48:54 @@ -4650,3 +4650,26 @@ 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; +} Index: wine/dlls/oleaut32/safearray.c =================================================================== RCS file: /home/wine/wine/dlls/oleaut32/safearray.c,v retrieving revision 1.13 diff -u -r1.13 safearray.c --- wine/dlls/oleaut32/safearray.c 2002/01/02 21:44:49 1.13 +++ wine/dlls/oleaut32/safearray.c 2002/01/24 14:49:04 @@ -20,7 +20,7 @@ #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_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]); /************************************************************************* @@ -130,6 +130,26 @@ } /************************************************************************* + * 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 */ @@ -515,6 +535,10 @@ 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);