- Timestamp:
- Aug 23, 2001, 8:11:21 PM (24 years ago)
- Location:
- trunk/src/oleaut32
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/oleaut32/oleaut32.def
r5856 r6575 1 ;/* $Id: oleaut32.def,v 1. 6 2001-06-01 07:50:02sandervl Exp $ */1 ;/* $Id: oleaut32.def,v 1.7 2001-08-23 18:11:20 sandervl Exp $ */ 2 2 LIBRARY OLAUTOS2 INITINSTANCE 3 3 DESCRIPTION 'Odin32 System DLL - OleAut32' … … 295 295 OleLoadPicturePath = _OleLoadPicturePath@24 @424 296 296 OleLoadPictureEx = _OleLoadPictureEx@32 @425 297 298 ;Win98 and higher (NT4.0sp4) 299 ;426 stub GetRecordInfoFromGuids ; stdcall (ptr long long long ptr ptr) 300 ;427 stub GetRecordInfoFromTypeInfo ; stdcall (ptr ptr) 301 ;428 stub OleLoadPictureFileEx 302 ;429 stub SafeArrayAllocDescriptorEx 303 ;430 stub SafeArrayCreateEx 304 ;431 stub SafeArrayCreateVectorEx 305 ;432 stub SafeArrayGetIID 306 ;433 stub SafeArrayGetRecordInfo 307 ;434 stub SafeArraySetIID 308 ;435 stub SafeArraySetRecordInfo 309 ;436 stub VarAbs ; stdcall (ptr ptr) 310 ;437 stub VarAdd ; stdcall (ptr ptr ptr) 311 ;438 stub VarAnd ; stdcall (ptr ptr ptr) 312 VarBstrCat = _VarBstrCat@12 @439 313 VarBstrCmp = _VarBstrCmp@16 @440 314 ;441 stub VarCat ; stdcall (ptr ptr ptr) 315 ;442 stub VarCmp ; stdcall (ptr ptr long long) 316 ;443 stub VarCyAbs 317 ;444 stub VarCyAdd 318 ;445 stub VarCyCmp 319 ;446 stub VarCyCmpR8 320 ;447 stub VarCyFix 321 ;448 stub VarCyInt 322 ;449 stub VarCyMul 323 ;450 stub VarCyMulI4 324 ;451 stub VarCyNeg 325 ;452 stub VarCyRound 326 ;453 stub VarCySub 327 ;454 stub VarDateFromUdateEx ; stdcall (ptr long long ptr) 328 ;455 stub VarDecAbs ; stdcall (ptr ptr) 329 ;456 stub VarDecAdd ; stdcall (ptr ptr ptr) 330 ;457 stub VarDecCmp ; stdcall (ptr ptr) 331 ;458 stub VarDecCmpR8 ; stdcall (ptr double) 332 ;459 stub VarDecDiv ; stdcall (ptr ptr ptr) 333 ;460 stub VarDecFix ; stdcall (ptr ptr) 334 ;461 stub VarDecInt ; stdcall (ptr ptr) 335 ;462 stub VarDecMul ; stdcall (ptr ptr ptr) 336 ;463 stub VarDecNeg ; stdcall (ptr ptr) 337 ;464 stub VarDecRound ; stdcall (ptr long ptr) 338 ;465 stub VarDecSub ; stdcall (ptr ptr ptr) 339 ;466 stub VarDiv ; stdcall (ptr ptr ptr) 340 ;467 stub VarEqv ; stdcall (ptr ptr ptr) 341 ;468 stub VarFix ; stdcall (ptr ptr) 342 ;469 stub VarFormat ; stdcall (ptr ptr long long long ptr) 343 ;470 stub VarFormatCurrency ; stdcall (ptr long long long long long ptr) 344 ;471 stub VarFormatDateTime ; stdcall (ptr long long ptr) 345 ;472 stub VarFormatFromTokens ; stdcall (ptr ptr ptr long ptr long) 346 ;473 stub VarFormatNumber ; stdcall (ptr long long long long long ptr) 347 ;474 stub VarFormatPercent ; stdcall (ptr long long long long long ptr) 348 ;475 stub VarIdiv ; stdcall (ptr ptr ptr) 349 ;476 stub VarImp ; stdcall (ptr ptr ptr) 350 ;477 stub VarInt ; stdcall (ptr ptr) 351 ;478 stub VarMod ; stdcall (ptr ptr ptr) 352 ;479 stub VarMonthName ; stdcall (long long long ptr) 353 ;480 stub VarMul ; stdcall (ptr ptr ptr) 354 ;481 stub VarNeg ; stdcall (ptr ptr) 355 ;482 stub VarNot ; stdcall (ptr ptr) 356 ;483 stub VarOr ; stdcall (ptr ptr ptr) 357 ;484 stub VarPow ; stdcall (ptr ptr ptr) 358 ;485 stub VarR4CmpR8 359 ;486 stub VarR8Pow ; stdcall (double double ptr) 360 ;487 stub VarR8Round ; stdcall (double long ptr) 361 ;488 stub VarRound ; stdcall (ptr long ptr) 362 ;489 stub VarSub ; stdcall (ptr ptr ptr) 363 ;490 stub VarTokenizeFormatString ; stdcall (ptr ptr long long long long ptr) 364 ;491 stub VarWeekdayName ; stdcall (long long long long ptr) 365 ;492 stub VarXor ; stdcall (ptr ptr ptr) -
trunk/src/oleaut32/olefont.c
r4837 r6575 20 20 #include "wine/unicode.h" 21 21 #include "oleauto.h" /* for SysAllocString(....) */ 22 #include "wine/obj_base.h" 22 23 #include "wine/obj_olefont.h" 23 24 #include "wine/obj_storage.h" … … 956 957 { 957 958 OLEFontImpl* newObject = 0; 959 LOGFONTW logFont; 960 INT fontHeight; 961 CY cySize; 958 962 _ICOM_THIS(OLEFontImpl, iface); 959 963 TRACE("(%p)->(%p)\n", this, ppfont); … … 974 978 *newObject = *this; 975 979 976 /* 977 * That new object starts with a reference count of 1 978 */ 980 /* We need to alloc new memory for the string, otherwise 981 * we free memory twice. 982 */ 983 newObject->description.lpstrName = HeapAlloc( 984 GetProcessHeap(),0, 985 (1+strlenW(this->description.lpstrName))*2 986 ); 987 /* We need to clone the HFONT too. This is just cut & paste from above */ 988 IFont_get_Size(iface, &cySize); 989 990 fontHeight = MulDiv(cySize.s.Lo, 2540L, 72L); 991 fontHeight = MulDiv(fontHeight, this->cyLogical,this->cyHimetric); 992 993 memset(&logFont, 0, sizeof(LOGFONTW)); 994 995 logFont.lfHeight = ((fontHeight%10000L)>5000L) ? (-fontHeight/10000L)-1 : 996 (-fontHeight/10000L); 997 logFont.lfItalic = this->description.fItalic; 998 logFont.lfUnderline = this->description.fUnderline; 999 logFont.lfStrikeOut = this->description.fStrikethrough; 1000 logFont.lfWeight = this->description.sWeight; 1001 logFont.lfCharSet = this->description.sCharset; 1002 logFont.lfOutPrecision = OUT_CHARACTER_PRECIS; 1003 logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; 1004 logFont.lfQuality = DEFAULT_QUALITY; 1005 logFont.lfPitchAndFamily = DEFAULT_PITCH; 1006 strcpyW(logFont.lfFaceName,this->description.lpstrName); 1007 1008 newObject->gdiFont = CreateFontIndirectW(&logFont); 1009 1010 1011 /* The cloned object starts with a reference count of 1 */ 979 1012 newObject->ref = 1; 980 1013 … … 1203 1236 { 1204 1237 _ICOM_THIS_From_IDispatch(IFont, iface); 1205 FIXME("(%p):Stub\n", this); 1206 1207 return E_NOTIMPL; 1238 FIXME("%p->(%ld,%s,%lx,%x), stub!\n", this,dispIdMember,debugstr_guid(riid),lcid, 1239 wFlags 1240 ); 1241 return S_OK; 1208 1242 } 1209 1243 … … 1593 1627 } 1594 1628 1629 /******************************************************************************* 1630 * StdFont ClassFactory 1631 */ 1632 typedef struct 1633 { 1634 /* IUnknown fields */ 1635 ICOM_VFIELD(IClassFactory); 1636 DWORD ref; 1637 } IClassFactoryImpl; 1638 1639 static HRESULT WINAPI 1640 SFCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { 1641 ICOM_THIS(IClassFactoryImpl,iface); 1642 1643 FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); 1644 return E_NOINTERFACE; 1645 } 1646 1647 static ULONG WINAPI 1648 SFCF_AddRef(LPCLASSFACTORY iface) { 1649 ICOM_THIS(IClassFactoryImpl,iface); 1650 return ++(This->ref); 1651 } 1652 1653 static ULONG WINAPI SFCF_Release(LPCLASSFACTORY iface) { 1654 ICOM_THIS(IClassFactoryImpl,iface); 1655 /* static class, won't be freed */ 1656 return --(This->ref); 1657 } 1658 1659 static HRESULT WINAPI SFCF_CreateInstance( 1660 LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj 1661 ) { 1662 ICOM_THIS(IClassFactoryImpl,iface); 1663 1664 if (IsEqualGUID(riid,&IID_IFont)) { 1665 FONTDESC fd; 1666 1667 WCHAR fname[] = { 'S','y','s','t','e','m',0 }; 1668 1669 fd.cbSizeofstruct = sizeof(fd); 1670 fd.lpstrName = fname; 1671 fd.cySize.s.Lo = 80000; 1672 fd.cySize.s.Hi = 0; 1673 fd.sWeight = 0; 1674 fd.sCharset = 0; 1675 fd.fItalic = 0; 1676 fd.fUnderline = 0; 1677 fd.fStrikethrough = 0; 1678 return OleCreateFontIndirect(&fd,riid,ppobj); 1679 } 1680 1681 FIXME("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); 1682 return E_NOINTERFACE; 1683 } 1684 1685 static HRESULT WINAPI SFCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { 1686 ICOM_THIS(IClassFactoryImpl,iface); 1687 FIXME("(%p)->(%d),stub!\n",This,dolock); 1688 return S_OK; 1689 } 1690 1691 static ICOM_VTABLE(IClassFactory) SFCF_Vtbl = { 1692 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 1693 SFCF_QueryInterface, 1694 SFCF_AddRef, 1695 SFCF_Release, 1696 SFCF_CreateInstance, 1697 SFCF_LockServer 1698 }; 1699 static IClassFactoryImpl STDFONT_CF = {&SFCF_Vtbl, 1 }; 1700 1701 void _get_STDFONT_CF(LPVOID *ppv) { *ppv = (LPVOID)&STDFONT_CF; } -
trunk/src/oleaut32/olepicture.c
r6504 r6575 900 900 jpeg_finish_decompress(&jd); 901 901 jpeg_destroy_decompress(&jd); 902 hdcref = CreateCompatibleDC(0);902 hdcref = GetDC(0); 903 903 This->desc.u.bmp.hbitmap=CreateDIBitmap( 904 904 hdcref, … … 928 928 * components which are in both 929 929 */ 930 hdcref = CreateCompatibleDC(0);930 hdcref = GetDC(0); 931 931 This->desc.u.bmp.hbitmap = CreateDIBitmap( 932 932 hdcref, … … 1135 1135 1136 1136 VariantInit(pVarResult); 1137 pVarResult->vt= VT_BOOL;1138 pVarResult->u.boolVal= FALSE;1137 V_VT(pVarResult) = VT_BOOL; 1138 V_UNION(pVarResult,boolVal) = FALSE; 1139 1139 return S_OK; 1140 1140 } -
trunk/src/oleaut32/stubs.cpp
r6504 r6575 1 /* $Id: stubs.cpp,v 1.1 0 2001-08-10 19:22:25sandervl Exp $ */1 /* $Id: stubs.cpp,v 1.11 2001-08-23 18:11:21 sandervl Exp $ */ 2 2 /* 3 3 * Win32 COM/OLE stubs for OS/2 … … 45 45 } 46 46 47 //*****************************************************************************48 //*****************************************************************************49 INT WIN32API VariantTimeToDosDateTime(DOUBLE vtime, USHORT * pwDosDate, USHORT * pwDosTime)50 {51 dprintf(("OLEAUT32: VariantTimeToDosDateTime - stub"));52 return 0;53 }54 47 55 48 //***************************************************************************** … … 61 54 } 62 55 63 //*****************************************************************************64 //*****************************************************************************65 typedef struct {66 INT cDig;67 ULONG dwInFlags;68 ULONG dwOutFlags;69 INT cchUsed;70 INT nBaseShift;71 INT nPwr10;72 } NUMPARSE;73 74 HRESULT WIN32API VarParseNumFromStr75 (OLECHAR * strIn,76 LCID lcid,77 ULONG dwFlags,78 NUMPARSE * pnumprs,79 BYTE * rgbDig)80 {81 dprintf(("OLEAUT32: VarParseNumFromStr - stub"));82 return S_OK;83 }84 85 //*****************************************************************************86 //*****************************************************************************87 HRESULT WIN32API VarNumFromParseNum88 (NUMPARSE * pnumprs,89 BYTE * rgbDig,90 ULONG dwVtBits,91 VARIANT * pvar)92 {93 dprintf(("OLEAUT32: VarNumFromParseNum - stub"));94 return S_OK;95 }96 56 97 57 //***************************************************************************** … … 197 157 //***************************************************************************** 198 158 //***************************************************************************** 199 INT WIN32API SystemTimeToVariantTime(LPSYSTEMTIME lpSystemTime, DOUBLE *pvtime)200 {201 dprintf(("OLEAUT32: SystemTimeToVariantTime - stub"));202 return 0;203 }204 205 //*****************************************************************************206 //*****************************************************************************207 INT WIN32API VariantTimeToSystemTime(DOUBLE vtime, LPSYSTEMTIME lpSystemTime)208 {209 dprintf(("OLEAUT32: VariantTimeToSystemTime - stub"));210 return 0;211 }212 213 //*****************************************************************************214 //*****************************************************************************215 159 HRESULT WIN32API VarDecFromUI1(BYTE bIn, DECIMAL *pdecOut) 216 160 { … … 437 381 //***************************************************************************** 438 382 //***************************************************************************** 439 typedef struct440 {441 SYSTEMTIME st;442 USHORT wDayOfYear;443 } UDATE;444 445 HRESULT WIN32API VarDateFromUdate(UDATE *pudateIn, ULONG dwFlags, DATE *pdateOut)446 {447 dprintf(("OLEAUT32: VarDateFromUdate - stub"));448 return S_OK;449 }450 451 //*****************************************************************************452 //*****************************************************************************453 HRESULT WIN32API VarUdateFromDate(DATE dateIn, ULONG dwFlags, UDATE *pudateOut)454 {455 dprintf(("OLEAUT32: VarUdateFromDate - stub"));456 return S_OK;457 }458 383 459 384 //***************************************************************************** -
trunk/src/oleaut32/typelib.c
r6512 r6575 41 41 * 42 42 */ 43 44 43 #ifdef __WIN32OS2__ 45 44 #define HAVE_FLOAT_H … … 66 65 67 66 #include "debugtools.h" 68 69 67 70 68 DEFAULT_DEBUG_CHANNEL(ole); … … 158 156 char szPath[dwPathLen]; 159 157 #endif 160 161 158 if ( !HIWORD(guid) ) 162 159 { … … 257 254 } 258 255 #endif 256 259 257 /****************************************************************************** 260 258 * LoadTypeLib [OLEAUT32.161] … … 802 800 } 803 801 804 if ( pvar->vt& VT_BYREF)805 return dump_Variant( pvar->u.pvarVal);802 if (V_VT(pvar) & VT_BYREF) 803 return dump_Variant(V_UNION(pvar,pvarVal)); 806 804 } 807 805 … … 1007 1005 1008 1006 if(offset <0) { /* data is packed in here */ 1009 pVar->vt= (offset & 0x7c000000 )>> 26;1007 V_VT(pVar) = (offset & 0x7c000000 )>> 26; 1010 1008 V_UNION(pVar, iVal) = offset & 0xffff; 1011 1009 return; 1012 1010 } 1013 TLB_Read(&( pVar->vt), sizeof(VARTYPE), pcx,1011 TLB_Read(&(V_VT(pVar)), sizeof(VARTYPE), pcx, 1014 1012 pcx->pTblDir->pCustData.offset + offset ); 1015 TRACE_(typelib)("Vartype = %x\n", pVar->vt);1016 switch (pVar->vt){1013 TRACE_(typelib)("Vartype = %x\n", V_VT(pVar)); 1014 switch (V_VT(pVar)){ 1017 1015 case VT_EMPTY: /* FIXME: is this right? */ 1018 1016 case VT_NULL: /* FIXME: is this right? */ … … 1077 1075 size=0; 1078 1076 FIXME("VARTYPE %d is not supported, setting pointer to NULL\n", 1079 pVar->vt);1077 V_VT(pVar)); 1080 1078 } 1081 1079 … … 1263 1261 &(*pptfd)->funcdesc.lprgelemdescParam[j].tdesc) ; 1264 1262 1265 V_UNION(& ((*pptfd)->funcdesc.lprgelemdescParam[j]), 1266 paramdesc.wParamFlags) = paraminfo.Flags; 1263 (*pptfd)->funcdesc.lprgelemdescParam[j].u.paramdesc.wParamFlags = paraminfo.Flags; 1267 1264 1268 1265 (*pptfd)->pParamDesc[j].Name = (void *) paraminfo.oName; … … 1358 1355 /* default value */ 1359 1356 if ( (PARAMFLAG_FHASDEFAULT & 1360 V_UNION(&((*pptfd)->funcdesc.lprgelemdescParam[j]), 1361 paramdesc.wParamFlags)) && 1357 (*pptfd)->funcdesc.lprgelemdescParam[j].u.paramdesc.wParamFlags) && 1362 1358 ((pFuncRec->FKCCIC) & 0x1000) ) 1363 1359 { … … 1366 1362 (pFuncRec->nrargs * 4 + 1) * sizeof(INT) ); 1367 1363 1368 PARAMDESC* pParamDesc = &V_UNION( 1369 & ((*pptfd)->funcdesc.lprgelemdescParam[j]), 1370 paramdesc); 1364 PARAMDESC* pParamDesc = & (*pptfd)->funcdesc.lprgelemdescParam[j].u.paramdesc; 1371 1365 1372 1366 pParamDesc->pparamdescex = TLB_Alloc(sizeof(PARAMDESCEX)); 1373 1367 pParamDesc->pparamdescex->cBytes = sizeof(PARAMDESCEX); 1374 1368 1375 1369 TLB_ReadValue(&(pParamDesc->pparamdescex->varDefaultValue), 1376 1370 pInt[j], pcx); … … 1385 1379 } 1386 1380 } 1387 1381 1388 1382 /* scode is not used: archaic win16 stuff FIXME: right? */ 1389 1383 (*pptfd)->funcdesc.cScodes = 0 ; 1390 1384 (*pptfd)->funcdesc.lprgscode = NULL ; 1391 1385 1392 1386 pptfd = & ((*pptfd)->next); 1393 1387 recoffset += reclength; … … 1436 1430 /* (*pptvd)->vardesc.lpstrSchema; is reserved (SDK) fixme?? */ 1437 1431 if(pVarRec->VarKind == VAR_CONST ){ 1438 V_UNION(&((*pptvd)->vardesc),lpvarValue)=TLB_Alloc(sizeof(VARIANT));1439 TLB_ReadValue( V_UNION(&((*pptvd)->vardesc),lpvarValue),1432 (*pptvd)->vardesc.u.lpvarValue=TLB_Alloc(sizeof(VARIANT)); 1433 TLB_ReadValue((*pptvd)->vardesc.u.lpvarValue, 1440 1434 pVarRec->OffsValue, pcx); 1441 } else1442 V_UNION(&((*pptvd)->vardesc),oInst)=pVarRec->OffsValue;1435 } else 1436 (*pptvd)->vardesc.u.oInst=pVarRec->OffsValue; 1443 1437 pptvd=&((*pptvd)->next); 1444 1438 recoffset += reclength; … … 1865 1859 /* FIXME: check safearray */ 1866 1860 if(td[3] < 0) 1867 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lptdesc)= & stndTypeDesc[td[2]];1861 pTypeLibImpl->pTypeDesc[i].u.lptdesc= & stndTypeDesc[td[2]]; 1868 1862 else 1869 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lptdesc)= & pTypeLibImpl->pTypeDesc[td[2]/8];1863 pTypeLibImpl->pTypeDesc[i].u.lptdesc= & pTypeLibImpl->pTypeDesc[td[2]/8]; 1870 1864 } 1871 1865 else if(td[0] == VT_CARRAY) 1872 1866 { 1873 1867 /* array descr table here */ 1874 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc)= (void *)((int) td[2]); /* temp store offset in*/1875 } 1868 pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)((int) td[2]); /* temp store offset in*/ 1869 } 1876 1870 else if(td[0] == VT_USERDEFINED) 1877 1871 { 1878 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),hreftype)= MAKELONG(td[2],td[3]);1872 pTypeLibImpl->pTypeDesc[i].u.hreftype = MAKELONG(td[2],td[3]); 1879 1873 } 1880 1874 if(++i<cTD) TLB_Read(td, sizeof(td), &cx, DO_NOT_SEEK); … … 1887 1881 if(tlbSegDir.pArrayDescriptions.offset>0) 1888 1882 { 1889 TLB_Read(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (int) V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc));1890 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc)= TLB_Alloc(sizeof(ARRAYDESC)+sizeof(SAFEARRAYBOUND)*(td[3]-1));1883 TLB_Read(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (int) pTypeLibImpl->pTypeDesc[i].u.lpadesc); 1884 pTypeLibImpl->pTypeDesc[i].u.lpadesc = TLB_Alloc(sizeof(ARRAYDESC)+sizeof(SAFEARRAYBOUND)*(td[3]-1)); 1891 1885 1892 1886 if(td[1]<0) 1893 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc)->tdescElem.vt = td[0] & VT_TYPEMASK;1887 pTypeLibImpl->pTypeDesc[i].u.lpadesc->tdescElem.vt = td[0] & VT_TYPEMASK; 1894 1888 else 1895 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc)->tdescElem = stndTypeDesc[td[0]/8];1896 1897 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc)->cDims = td[2];1889 pTypeLibImpl->pTypeDesc[i].u.lpadesc->tdescElem = stndTypeDesc[td[0]/8]; 1890 1891 pTypeLibImpl->pTypeDesc[i].u.lpadesc->cDims = td[2]; 1898 1892 1899 1893 for(j = 0; j<td[2]; j++) 1900 1894 { 1901 TLB_Read(& V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc)->rgbounds[j].cElements,1895 TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].cElements, 1902 1896 sizeof(INT), &cx, DO_NOT_SEEK); 1903 TLB_Read(& V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc)->rgbounds[j].lLbound,1897 TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].lLbound, 1904 1898 sizeof(INT), &cx, DO_NOT_SEEK); 1905 1899 } … … 1907 1901 else 1908 1902 { 1909 V_UNION(&(pTypeLibImpl->pTypeDesc[i]),lpadesc)= NULL;1903 pTypeLibImpl->pTypeDesc[i].u.lpadesc = NULL; 1910 1904 ERR("didn't find array description data\n"); 1911 1905 } … … 3016 3010 if (i<pDispParams->cArgs) { 3017 3011 TRACE("set %d to disparg type %d vs %d\n",i, 3018 pDispParams->rgvarg[i].vt,3012 V_VT(pDispParams->rgvarg+i), 3019 3013 pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt 3020 3014 ); 3021 args[i+1] = pDispParams->rgvarg[i].u.lVal;3015 args[i+1] = V_UNION(pDispParams->rgvarg+i,lVal); 3022 3016 } else { 3023 3017 TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc); … … 3054 3048 3055 3049 VariantInit(&pVarResult[i]); 3056 pVarResult[i].u.intVal= args2[i];3050 V_UNION(pVarResult+i,intVal) = args2[i]; 3057 3051 3058 3052 if (tdesc->vt == VT_PTR) 3059 3053 tdesc = tdesc->u.lptdesc; 3060 pVarResult[i].vt= tdesc->vt;3054 V_VT(pVarResult+i) = tdesc->vt; 3061 3055 3062 3056 /* HACK: VB5 likes this. … … 3066 3060 */ 3067 3061 if ((tdesc->vt == VT_PTR) && (dwFlags & DISPATCH_METHOD)) 3068 pVarResult[i].vt= VT_DISPATCH;3062 V_VT(pVarResult+i) = VT_DISPATCH; 3069 3063 TRACE("storing into variant: [%d] type %d, val %08x\n", 3070 i, pVarResult[i].vt,pVarResult[i].u.intVal3064 i,V_VT(pVarResult+i),V_UNION(pVarResult+i,intVal) 3071 3065 ); 3072 3066 } -
trunk/src/oleaut32/variant.c
r6507 r6575 20 20 * - The parsing does not accept as many formats as the Windows implementation. 21 21 */ 22 23 22 #ifdef __WIN32OS2__ 24 23 #define HAVE_FLOAT_H … … 121 120 * 122 121 ******************************************************************************/ 123 static BOOL DateTimeStringToTm( OLECHAR* strIn, LCID lcid, struct tm* pTm )122 static BOOL DateTimeStringToTm( OLECHAR* strIn, DWORD dwFlags, struct tm* pTm ) 124 123 { 125 124 BOOL res = FALSE; … … 147 146 if( ParseDateTime( strDateTime, lowstr, field, ftype, MAXDATEFIELDS, &nf) == 0 ) 148 147 { 149 if( lcid& VAR_DATEVALUEONLY )148 if( dwFlags & VAR_DATEVALUEONLY ) 150 149 { 151 150 /* Get the date information. … … 165 164 } 166 165 } 167 if( lcid& VAR_TIMEVALUEONLY )166 if( dwFlags & VAR_TIMEVALUEONLY ) 168 167 { 169 168 /* Get time information only. … … 338 337 * Returns TRUE if successful. 339 338 */ 340 static BOOL DateToTm( DATE dateIn, LCID lcid, struct tm* pTm )339 static BOOL DateToTm( DATE dateIn, DWORD dwFlags, struct tm* pTm ) 341 340 { 342 341 /* Do not process dates smaller than January 1, 1900. … … 350 349 memset(pTm,0,sizeof(*pTm)); 351 350 352 /* Because of the nature of DATE format w itch351 /* Because of the nature of DATE format which 353 352 * associates 2.0 to January 1, 1900. We will 354 353 * remove 1.0 from the whole part of the DATE 355 354 * so that in the following code 1.0 356 355 * will correspond to January 1, 1900. 357 * This simpl yfies the processing of the DATE value.356 * This simplifies the processing of the DATE value. 358 357 */ 359 358 dateIn -= 1.0; … … 362 361 decimalPart = fmod( dateIn, wholePart ); 363 362 364 if( !( lcid& VAR_TIMEVALUEONLY) )363 if( !(dwFlags & VAR_TIMEVALUEONLY) ) 365 364 { 366 365 int nDay = 0; 367 366 int leapYear = 0; 368 367 double yearsSince1900 = 0; 369 /* Start at 1900, this where the DATE time 0.0 starts.368 /* Start at 1900, this is where the DATE time 0.0 starts. 370 369 */ 371 370 pTm->tm_year = 1900; … … 383 382 } 384 383 385 /* find what day of that year doesthe "wholePart" corresponds to.384 /* find what day of that year the "wholePart" corresponds to. 386 385 * Note: nDay is in [1-366] format 387 386 */ 388 387 nDay = (int) ( wholePart - floor( yearsSince1900 * DAYS_IN_ONE_YEAR ) ); 389 388 /* Set the tm_yday value. 390 * Note: The day ismust be converted from [1-366] to [0-365]389 * Note: The day must be converted from [1-366] to [0-365] 391 390 */ 392 391 /*pTm->tm_yday = nDay - 1;*/ 393 /* find which mo untthis day corresponds to.392 /* find which month this day corresponds to. 394 393 */ 395 394 if( nDay <= 31 ) … … 454 453 } 455 454 } 456 if( !( lcid& VAR_DATEVALUEONLY) )455 if( !(dwFlags & VAR_DATEVALUEONLY) ) 457 456 { 458 457 /* find the number of seconds in this day. … … 479 478 { 480 479 int size = 0; 481 switch( parg->vt& VT_TYPEMASK )480 switch( V_VT(parg) & VT_TYPEMASK ) 482 481 { 483 482 case( VT_I2 ): … … 522 521 case( VT_DECIMAL ): 523 522 default: 524 FIXME("Add size information for type vt=%d\n", parg->vt& VT_TYPEMASK );523 FIXME("Add size information for type vt=%d\n", V_VT(parg) & VT_TYPEMASK ); 525 524 break; 526 525 } … … 879 878 * This function dispatches execution to the proper conversion API 880 879 * to do the necessary coercion. 880 * 881 * FIXME: Passing down dwFlags to the conversion functions is wrong, this 882 * is a different flagmask. Check MSDN. 881 883 */ 882 884 static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps, VARTYPE vt ) … … 884 886 HRESULT res = S_OK; 885 887 unsigned short vtFrom = 0; 886 vtFrom = ps->vt & VT_TYPEMASK; 888 vtFrom = V_VT(ps) & VT_TYPEMASK; 889 887 890 888 891 /* Note: Since "long" and "int" values both have 4 bytes and are … … 910 913 if( res == S_OK ) 911 914 { 912 pd->vt= VT_NULL;915 V_VT(pd) = VT_NULL; 913 916 } 914 917 break; … … 920 923 break; 921 924 case( VT_I2 ): 922 res = VarI1FromI2( ps->u.iVal, &(pd->u.cVal) );925 res = VarI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,cVal) ); 923 926 break; 924 927 case( VT_INT ): 925 928 case( VT_I4 ): 926 res = VarI1FromI4( ps->u.lVal, &(pd->u.cVal) );929 res = VarI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,cVal) ); 927 930 break; 928 931 case( VT_UI1 ): 929 res = VarI1FromUI1( ps->u.bVal, &(pd->u.cVal) );932 res = VarI1FromUI1( V_UNION(ps,bVal), &V_UNION(pd,cVal) ); 930 933 break; 931 934 case( VT_UI2 ): 932 res = VarI1FromUI2( ps->u.uiVal, &(pd->u.cVal) );935 res = VarI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cVal) ); 933 936 break; 934 937 case( VT_UINT ): 935 938 case( VT_UI4 ): 936 res = VarI1FromUI4( ps->u.ulVal, &(pd->u.cVal) );939 res = VarI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cVal) ); 937 940 break; 938 941 case( VT_R4 ): 939 res = VarI1FromR4( ps->u.fltVal, &(pd->u.cVal) );942 res = VarI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,cVal) ); 940 943 break; 941 944 case( VT_R8 ): 942 res = VarI1FromR8( ps->u.dblVal, &(pd->u.cVal) );945 res = VarI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,cVal) ); 943 946 break; 944 947 case( VT_DATE ): 945 res = VarI1FromDate( ps->u.date, &(pd->u.cVal) );948 res = VarI1FromDate( V_UNION(ps,date), &V_UNION(pd,cVal) ); 946 949 break; 947 950 case( VT_BOOL ): 948 res = VarI1FromBool( ps->u.boolVal, &(pd->u.cVal) );951 res = VarI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,cVal) ); 949 952 break; 950 953 case( VT_BSTR ): 951 res = VarI1FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.cVal) );954 res = VarI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cVal) ); 952 955 break; 953 956 case( VT_CY ): 954 res = VarI1FromCy( ps->u.cyVal, &(pd->u.cVal) ); 957 res = VarI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,cVal) ); 958 break; 955 959 case( VT_DISPATCH ): 956 /*res = VarI1FromDisp32( ps->u.pdispVal, lcid, &(pd->u.cVal) );*/ 960 /*res = VarI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cVal) );*/ 961 case( VT_DECIMAL ): 962 /*res = VarI1FromDec( V_UNION(ps,decVal), &V_UNION(pd,cVal) );*/ 957 963 case( VT_UNKNOWN ): 958 /*res = VarI1From32( ps->u.lVal, &(pd->u.cVal) );*/959 case( VT_DECIMAL ):960 /*res = VarI1FromDec32( ps->u.decVal, &(pd->u.cVal) );*/961 964 default: 962 965 res = DISP_E_TYPEMISMATCH; … … 970 973 { 971 974 case( VT_I1 ): 972 res = VarI2FromI1( ps->u.cVal, &(pd->u.iVal) );975 res = VarI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,iVal) ); 973 976 break; 974 977 case( VT_I2 ): … … 977 980 case( VT_INT ): 978 981 case( VT_I4 ): 979 res = VarI2FromI4( ps->u.lVal, &(pd->u.iVal) );982 res = VarI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,iVal) ); 980 983 break; 981 984 case( VT_UI1 ): 982 res = VarI2FromUI1( ps->u.bVal, &(pd->u.iVal) );985 res = VarI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,iVal) ); 983 986 break; 984 987 case( VT_UI2 ): 985 res = VarI2FromUI2( ps->u.uiVal, &(pd->u.iVal) );988 res = VarI2FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,iVal) ); 986 989 break; 987 990 case( VT_UINT ): 988 991 case( VT_UI4 ): 989 res = VarI2FromUI4( ps->u.ulVal, &(pd->u.iVal) );992 res = VarI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,iVal) ); 990 993 break; 991 994 case( VT_R4 ): 992 res = VarI2FromR4( ps->u.fltVal, &(pd->u.iVal) );995 res = VarI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,iVal) ); 993 996 break; 994 997 case( VT_R8 ): 995 res = VarI2FromR8( ps->u.dblVal, &(pd->u.iVal) );998 res = VarI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,iVal) ); 996 999 break; 997 1000 case( VT_DATE ): 998 res = VarI2FromDate( ps->u.date, &(pd->u.iVal) );1001 res = VarI2FromDate( V_UNION(ps,date), &V_UNION(pd,iVal) ); 999 1002 break; 1000 1003 case( VT_BOOL ): 1001 res = VarI2FromBool( ps->u.boolVal, &(pd->u.iVal) );1004 res = VarI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,iVal) ); 1002 1005 break; 1003 1006 case( VT_BSTR ): 1004 res = VarI2FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.iVal) );1007 res = VarI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,iVal) ); 1005 1008 break; 1006 1009 case( VT_CY ): 1007 res = VarI2FromCy( ps->u.cyVal, &(pd->u.iVal) ); 1010 res = VarI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,iVal) ); 1011 break; 1008 1012 case( VT_DISPATCH ): 1009 /*res = VarI2FromDisp32( ps->u.pdispVal, lcid, &(pd->u.iVal) );*/ 1013 /*res = VarI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,iVal) );*/ 1014 case( VT_DECIMAL ): 1015 /*res = VarI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,iVal) );*/ 1010 1016 case( VT_UNKNOWN ): 1011 /*res = VarI2From32( ps->u.lVal, &(pd->u.iVal) );*/1012 case( VT_DECIMAL ):1013 /*res = VarI2FromDec32( ps->u.deiVal, &(pd->u.iVal) );*/1014 1017 default: 1015 1018 res = DISP_E_TYPEMISMATCH; … … 1024 1027 { 1025 1028 case( VT_I1 ): 1026 res = VarI4FromI1( ps->u.cVal, &(pd->u.lVal) );1029 res = VarI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,lVal) ); 1027 1030 break; 1028 1031 case( VT_I2 ): 1029 res = VarI4FromI2( ps->u.iVal, &(pd->u.lVal) );1032 res = VarI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,lVal) ); 1030 1033 break; 1031 1034 case( VT_INT ): … … 1037 1040 break; 1038 1041 case( VT_UI1 ): 1039 res = VarI4FromUI1( ps->u.bVal, &(pd->u.lVal) );1042 res = VarI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,lVal) ); 1040 1043 break; 1041 1044 case( VT_UI2 ): 1042 res = VarI4FromUI2( ps->u.uiVal, &(pd->u.lVal) );1045 res = VarI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,lVal) ); 1043 1046 break; 1044 1047 case( VT_UINT ): 1045 1048 case( VT_UI4 ): 1046 res = VarI4FromUI4( ps->u.ulVal, &(pd->u.lVal) );1049 res = VarI4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,lVal) ); 1047 1050 break; 1048 1051 case( VT_R4 ): 1049 res = VarI4FromR4( ps->u.fltVal, &(pd->u.lVal) );1052 res = VarI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,lVal) ); 1050 1053 break; 1051 1054 case( VT_R8 ): 1052 res = VarI4FromR8( ps->u.dblVal, &(pd->u.lVal) );1055 res = VarI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,lVal) ); 1053 1056 break; 1054 1057 case( VT_DATE ): 1055 res = VarI4FromDate( ps->u.date, &(pd->u.lVal) );1058 res = VarI4FromDate( V_UNION(ps,date), &V_UNION(pd,lVal) ); 1056 1059 break; 1057 1060 case( VT_BOOL ): 1058 res = VarI4FromBool( ps->u.boolVal, &(pd->u.lVal) );1061 res = VarI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,lVal) ); 1059 1062 break; 1060 1063 case( VT_BSTR ): 1061 res = VarI4FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.lVal) );1064 res = VarI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,lVal) ); 1062 1065 break; 1063 1066 case( VT_CY ): 1064 res = VarI4FromCy( ps->u.cyVal, &(pd->u.lVal) ); 1067 res = VarI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,lVal) ); 1068 break; 1065 1069 case( VT_DISPATCH ): 1066 /*res = VarI4FromDisp32( ps->u.pdispVal, lcid, &(pd->u.lVal) );*/ 1070 /*res = VarI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,lVal) );*/ 1071 case( VT_DECIMAL ): 1072 /*res = VarI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,lVal) );*/ 1067 1073 case( VT_UNKNOWN ): 1068 /*res = VarI4From32( ps->u.lVal, &(pd->u.lVal) );*/1069 case( VT_DECIMAL ):1070 /*res = VarI4FromDec32( ps->u.deiVal, &(pd->u.lVal) );*/1071 1074 default: 1072 1075 res = DISP_E_TYPEMISMATCH; … … 1080 1083 { 1081 1084 case( VT_I1 ): 1082 res = VarUI1FromI1( ps->u.cVal, &(pd->u.bVal) );1085 res = VarUI1FromI1( V_UNION(ps,cVal), &V_UNION(pd,bVal) ); 1083 1086 break; 1084 1087 case( VT_I2 ): 1085 res = VarUI1FromI2( ps->u.iVal, &(pd->u.bVal) );1088 res = VarUI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,bVal) ); 1086 1089 break; 1087 1090 case( VT_INT ): 1088 1091 case( VT_I4 ): 1089 res = VarUI1FromI4( ps->u.lVal, &(pd->u.bVal) );1092 res = VarUI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,bVal) ); 1090 1093 break; 1091 1094 case( VT_UI1 ): … … 1093 1096 break; 1094 1097 case( VT_UI2 ): 1095 res = VarUI1FromUI2( ps->u.uiVal, &(pd->u.bVal) );1098 res = VarUI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,bVal) ); 1096 1099 break; 1097 1100 case( VT_UINT ): 1098 1101 case( VT_UI4 ): 1099 res = VarUI1FromUI4( ps->u.ulVal, &(pd->u.bVal) );1102 res = VarUI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,bVal) ); 1100 1103 break; 1101 1104 case( VT_R4 ): 1102 res = VarUI1FromR4( ps->u.fltVal, &(pd->u.bVal) );1105 res = VarUI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,bVal) ); 1103 1106 break; 1104 1107 case( VT_R8 ): 1105 res = VarUI1FromR8( ps->u.dblVal, &(pd->u.bVal) );1108 res = VarUI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,bVal) ); 1106 1109 break; 1107 1110 case( VT_DATE ): 1108 res = VarUI1FromDate( ps->u.date, &(pd->u.bVal) );1111 res = VarUI1FromDate( V_UNION(ps,date), &V_UNION(pd,bVal) ); 1109 1112 break; 1110 1113 case( VT_BOOL ): 1111 res = VarUI1FromBool( ps->u.boolVal, &(pd->u.bVal) );1114 res = VarUI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,bVal) ); 1112 1115 break; 1113 1116 case( VT_BSTR ): 1114 res = VarUI1FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.bVal) );1117 res = VarUI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,bVal) ); 1115 1118 break; 1116 1119 case( VT_CY ): 1117 res = VarUI1FromCy( ps->u.cyVal, &(pd->u.bVal) ); 1120 res = VarUI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,bVal) ); 1121 break; 1118 1122 case( VT_DISPATCH ): 1119 /*res = VarUI1FromDisp32( ps->u.pdispVal, lcid, &(pd->u.bVal) );*/ 1123 /*res = VarUI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,bVal) );*/ 1124 case( VT_DECIMAL ): 1125 /*res = VarUI1FromDec( V_UNION(ps,deiVal), &V_UNION(pd,bVal) );*/ 1120 1126 case( VT_UNKNOWN ): 1121 /*res = VarUI1From32( ps->u.lVal, &(pd->u.bVal) );*/1122 case( VT_DECIMAL ):1123 /*res = VarUI1FromDec32( ps->u.deiVal, &(pd->u.bVal) );*/1124 1127 default: 1125 1128 res = DISP_E_TYPEMISMATCH; … … 1133 1136 { 1134 1137 case( VT_I1 ): 1135 res = VarUI2FromI1( ps->u.cVal, &(pd->u.uiVal) );1138 res = VarUI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,uiVal) ); 1136 1139 break; 1137 1140 case( VT_I2 ): 1138 res = VarUI2FromI2( ps->u.iVal, &(pd->u.uiVal) );1141 res = VarUI2FromI2( V_UNION(ps,iVal), &V_UNION(pd,uiVal) ); 1139 1142 break; 1140 1143 case( VT_INT ): 1141 1144 case( VT_I4 ): 1142 res = VarUI2FromI4( ps->u.lVal, &(pd->u.uiVal) );1145 res = VarUI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,uiVal) ); 1143 1146 break; 1144 1147 case( VT_UI1 ): 1145 res = VarUI2FromUI1( ps->u.bVal, &(pd->u.uiVal) );1148 res = VarUI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,uiVal) ); 1146 1149 break; 1147 1150 case( VT_UI2 ): … … 1150 1153 case( VT_UINT ): 1151 1154 case( VT_UI4 ): 1152 res = VarUI2FromUI4( ps->u.ulVal, &(pd->u.uiVal) );1155 res = VarUI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,uiVal) ); 1153 1156 break; 1154 1157 case( VT_R4 ): 1155 res = VarUI2FromR4( ps->u.fltVal, &(pd->u.uiVal) );1158 res = VarUI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,uiVal) ); 1156 1159 break; 1157 1160 case( VT_R8 ): 1158 res = VarUI2FromR8( ps->u.dblVal, &(pd->u.uiVal) );1161 res = VarUI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,uiVal) ); 1159 1162 break; 1160 1163 case( VT_DATE ): 1161 res = VarUI2FromDate( ps->u.date, &(pd->u.uiVal) );1164 res = VarUI2FromDate( V_UNION(ps,date), &V_UNION(pd,uiVal) ); 1162 1165 break; 1163 1166 case( VT_BOOL ): 1164 res = VarUI2FromBool( ps->u.boolVal, &(pd->u.uiVal) );1167 res = VarUI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,uiVal) ); 1165 1168 break; 1166 1169 case( VT_BSTR ): 1167 res = VarUI2FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.uiVal) );1170 res = VarUI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,uiVal) ); 1168 1171 break; 1169 1172 case( VT_CY ): 1170 res = VarUI2FromCy( ps->u.cyVal, &(pd->u.uiVal) ); 1173 res = VarUI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,uiVal) ); 1174 break; 1171 1175 case( VT_DISPATCH ): 1172 /*res = VarUI2FromDisp32( ps->u.pdispVal, lcid, &(pd->u.uiVal) );*/ 1176 /*res = VarUI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,uiVal) );*/ 1177 case( VT_DECIMAL ): 1178 /*res = VarUI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,uiVal) );*/ 1173 1179 case( VT_UNKNOWN ): 1174 /*res = VarUI2From32( ps->u.lVal, &(pd->u.uiVal) );*/1175 case( VT_DECIMAL ):1176 /*res = VarUI2FromDec32( ps->u.deiVal, &(pd->u.uiVal) );*/1177 1180 default: 1178 1181 res = DISP_E_TYPEMISMATCH; … … 1187 1190 { 1188 1191 case( VT_I1 ): 1189 res = VarUI4FromI1( ps->u.cVal, &(pd->u.ulVal) );1192 res = VarUI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,ulVal) ); 1190 1193 break; 1191 1194 case( VT_I2 ): 1192 res = VarUI4FromI2( ps->u.iVal, &(pd->u.ulVal) );1195 res = VarUI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,ulVal) ); 1193 1196 break; 1194 1197 case( VT_INT ): 1195 1198 case( VT_I4 ): 1196 res = VarUI4FromI4( ps->u.lVal, &(pd->u.ulVal) );1199 res = VarUI4FromI4( V_UNION(ps,lVal), &V_UNION(pd,ulVal) ); 1197 1200 break; 1198 1201 case( VT_UI1 ): 1199 res = VarUI4FromUI1( ps->u.bVal, &(pd->u.ulVal) );1202 res = VarUI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,ulVal) ); 1200 1203 break; 1201 1204 case( VT_UI2 ): 1202 res = VarUI4FromUI2( ps->u.uiVal, &(pd->u.ulVal) );1205 res = VarUI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,ulVal) ); 1203 1206 break; 1204 1207 case( VT_UI4 ): … … 1206 1209 break; 1207 1210 case( VT_R4 ): 1208 res = VarUI4FromR4( ps->u.fltVal, &(pd->u.ulVal) );1211 res = VarUI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,ulVal) ); 1209 1212 break; 1210 1213 case( VT_R8 ): 1211 res = VarUI4FromR8( ps->u.dblVal, &(pd->u.ulVal) );1214 res = VarUI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,ulVal) ); 1212 1215 break; 1213 1216 case( VT_DATE ): 1214 res = VarUI4FromDate( ps->u.date, &(pd->u.ulVal) );1217 res = VarUI4FromDate( V_UNION(ps,date), &V_UNION(pd,ulVal) ); 1215 1218 break; 1216 1219 case( VT_BOOL ): 1217 res = VarUI4FromBool( ps->u.boolVal, &(pd->u.ulVal) );1220 res = VarUI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,ulVal) ); 1218 1221 break; 1219 1222 case( VT_BSTR ): 1220 res = VarUI4FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.ulVal) );1223 res = VarUI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,ulVal) ); 1221 1224 break; 1222 1225 case( VT_CY ): 1223 res = VarUI4FromCy( ps->u.cyVal, &(pd->u.ulVal) ); 1226 res = VarUI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,ulVal) ); 1227 break; 1224 1228 case( VT_DISPATCH ): 1225 /*res = VarUI4FromDisp32( ps->u.pdispVal, lcid, &(pd->u.ulVal) );*/ 1229 /*res = VarUI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,ulVal) );*/ 1230 case( VT_DECIMAL ): 1231 /*res = VarUI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,ulVal) );*/ 1226 1232 case( VT_UNKNOWN ): 1227 /*res = VarUI4From32( ps->u.lVal, &(pd->u.ulVal) );*/1228 case( VT_DECIMAL ):1229 /*res = VarUI4FromDec32( ps->u.deiVal, &(pd->u.ulVal) );*/1230 1233 default: 1231 1234 res = DISP_E_TYPEMISMATCH; … … 1239 1242 { 1240 1243 case( VT_I1 ): 1241 res = VarR4FromI1( ps->u.cVal, &(pd->u.fltVal) );1244 res = VarR4FromI1( V_UNION(ps,cVal), &V_UNION(pd,fltVal) ); 1242 1245 break; 1243 1246 case( VT_I2 ): 1244 res = VarR4FromI2( ps->u.iVal, &(pd->u.fltVal) );1247 res = VarR4FromI2( V_UNION(ps,iVal), &V_UNION(pd,fltVal) ); 1245 1248 break; 1246 1249 case( VT_INT ): 1247 1250 case( VT_I4 ): 1248 res = VarR4FromI4( ps->u.lVal, &(pd->u.fltVal) );1251 res = VarR4FromI4( V_UNION(ps,lVal), &V_UNION(pd,fltVal) ); 1249 1252 break; 1250 1253 case( VT_UI1 ): 1251 res = VarR4FromUI1( ps->u.bVal, &(pd->u.fltVal) );1254 res = VarR4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,fltVal) ); 1252 1255 break; 1253 1256 case( VT_UI2 ): 1254 res = VarR4FromUI2( ps->u.uiVal, &(pd->u.fltVal) );1257 res = VarR4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,fltVal) ); 1255 1258 break; 1256 1259 case( VT_UINT ): 1257 1260 case( VT_UI4 ): 1258 res = VarR4FromUI4( ps->u.ulVal, &(pd->u.fltVal) );1261 res = VarR4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,fltVal) ); 1259 1262 break; 1260 1263 case( VT_R4 ): … … 1262 1265 break; 1263 1266 case( VT_R8 ): 1264 res = VarR4FromR8( ps->u.dblVal, &(pd->u.fltVal) );1267 res = VarR4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,fltVal) ); 1265 1268 break; 1266 1269 case( VT_DATE ): 1267 res = VarR4FromDate( ps->u.date, &(pd->u.fltVal) );1270 res = VarR4FromDate( V_UNION(ps,date), &V_UNION(pd,fltVal) ); 1268 1271 break; 1269 1272 case( VT_BOOL ): 1270 res = VarR4FromBool( ps->u.boolVal, &(pd->u.fltVal) );1273 res = VarR4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,fltVal) ); 1271 1274 break; 1272 1275 case( VT_BSTR ): 1273 res = VarR4FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.fltVal) );1276 res = VarR4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,fltVal) ); 1274 1277 break; 1275 1278 case( VT_CY ): 1276 res = VarR4FromCy( ps->u.cyVal, &(pd->u.fltVal) ); 1279 res = VarR4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,fltVal) ); 1280 break; 1277 1281 case( VT_DISPATCH ): 1278 /*res = VarR4FromDisp32( ps->u.pdispVal, lcid, &(pd->u.fltVal) );*/ 1282 /*res = VarR4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,fltVal) );*/ 1283 case( VT_DECIMAL ): 1284 /*res = VarR4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,fltVal) );*/ 1279 1285 case( VT_UNKNOWN ): 1280 /*res = VarR4From32( ps->u.lVal, &(pd->u.fltVal) );*/1281 case( VT_DECIMAL ):1282 /*res = VarR4FromDec32( ps->u.deiVal, &(pd->u.fltVal) );*/1283 1286 default: 1284 1287 res = DISP_E_TYPEMISMATCH; … … 1292 1295 { 1293 1296 case( VT_I1 ): 1294 res = VarR8FromI1( ps->u.cVal, &(pd->u.dblVal) );1297 res = VarR8FromI1( V_UNION(ps,cVal), &V_UNION(pd,dblVal) ); 1295 1298 break; 1296 1299 case( VT_I2 ): 1297 res = VarR8FromI2( ps->u.iVal, &(pd->u.dblVal) );1300 res = VarR8FromI2( V_UNION(ps,iVal), &V_UNION(pd,dblVal) ); 1298 1301 break; 1299 1302 case( VT_INT ): 1300 1303 case( VT_I4 ): 1301 res = VarR8FromI4( ps->u.lVal, &(pd->u.dblVal) );1304 res = VarR8FromI4( V_UNION(ps,lVal), &V_UNION(pd,dblVal) ); 1302 1305 break; 1303 1306 case( VT_UI1 ): 1304 res = VarR8FromUI1( ps->u.bVal, &(pd->u.dblVal) );1307 res = VarR8FromUI1( V_UNION(ps,bVal), &V_UNION(pd,dblVal) ); 1305 1308 break; 1306 1309 case( VT_UI2 ): 1307 res = VarR8FromUI2( ps->u.uiVal, &(pd->u.dblVal) );1310 res = VarR8FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,dblVal) ); 1308 1311 break; 1309 1312 case( VT_UINT ): 1310 1313 case( VT_UI4 ): 1311 res = VarR8FromUI4( ps->u.ulVal, &(pd->u.dblVal) );1314 res = VarR8FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,dblVal) ); 1312 1315 break; 1313 1316 case( VT_R4 ): 1314 res = VarR8FromR4( ps->u.fltVal, &(pd->u.dblVal) );1317 res = VarR8FromR4( V_UNION(ps,fltVal), &V_UNION(pd,dblVal) ); 1315 1318 break; 1316 1319 case( VT_R8 ): … … 1318 1321 break; 1319 1322 case( VT_DATE ): 1320 res = VarR8FromDate( ps->u.date, &(pd->u.dblVal) );1323 res = VarR8FromDate( V_UNION(ps,date), &V_UNION(pd,dblVal) ); 1321 1324 break; 1322 1325 case( VT_BOOL ): 1323 res = VarR8FromBool( ps->u.boolVal, &(pd->u.dblVal) );1326 res = VarR8FromBool( V_UNION(ps,boolVal), &V_UNION(pd,dblVal) ); 1324 1327 break; 1325 1328 case( VT_BSTR ): 1326 res = VarR8FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.dblVal) );1329 res = VarR8FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,dblVal) ); 1327 1330 break; 1328 1331 case( VT_CY ): 1329 res = VarR8FromCy( ps->u.cyVal, &(pd->u.dblVal) ); 1332 res = VarR8FromCy( V_UNION(ps,cyVal), &V_UNION(pd,dblVal) ); 1333 break; 1330 1334 case( VT_DISPATCH ): 1331 /*res = VarR8FromDisp32( ps->u.pdispVal, lcid, &(pd->u.dblVal) );*/ 1335 /*res = VarR8FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,dblVal) );*/ 1336 case( VT_DECIMAL ): 1337 /*res = VarR8FromDec( V_UNION(ps,deiVal), &V_UNION(pd,dblVal) );*/ 1332 1338 case( VT_UNKNOWN ): 1333 /*res = VarR8From32( ps->u.lVal, &(pd->u.dblVal) );*/1334 case( VT_DECIMAL ):1335 /*res = VarR8FromDec32( ps->u.deiVal, &(pd->u.dblVal) );*/1336 1339 default: 1337 1340 res = DISP_E_TYPEMISMATCH; … … 1345 1348 { 1346 1349 case( VT_I1 ): 1347 res = VarDateFromI1( ps->u.cVal, &(pd->u.date) );1350 res = VarDateFromI1( V_UNION(ps,cVal), &V_UNION(pd,date) ); 1348 1351 break; 1349 1352 case( VT_I2 ): 1350 res = VarDateFromI2( ps->u.iVal, &(pd->u.date) );1353 res = VarDateFromI2( V_UNION(ps,iVal), &V_UNION(pd,date) ); 1351 1354 break; 1352 1355 case( VT_INT ): 1353 res = VarDateFromInt( ps->u.intVal, &(pd->u.date) );1356 res = VarDateFromInt( V_UNION(ps,intVal), &V_UNION(pd,date) ); 1354 1357 break; 1355 1358 case( VT_I4 ): 1356 res = VarDateFromI4( ps->u.lVal, &(pd->u.date) );1359 res = VarDateFromI4( V_UNION(ps,lVal), &V_UNION(pd,date) ); 1357 1360 break; 1358 1361 case( VT_UI1 ): 1359 res = VarDateFromUI1( ps->u.bVal, &(pd->u.date) );1362 res = VarDateFromUI1( V_UNION(ps,bVal), &V_UNION(pd,date) ); 1360 1363 break; 1361 1364 case( VT_UI2 ): 1362 res = VarDateFromUI2( ps->u.uiVal, &(pd->u.date) );1365 res = VarDateFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,date) ); 1363 1366 break; 1364 1367 case( VT_UINT ): 1365 res = VarDateFromUint( ps->u.uintVal, &(pd->u.date) );1368 res = VarDateFromUint( V_UNION(ps,uintVal), &V_UNION(pd,date) ); 1366 1369 break; 1367 1370 case( VT_UI4 ): 1368 res = VarDateFromUI4( ps->u.ulVal, &(pd->u.date) );1371 res = VarDateFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,date) ); 1369 1372 break; 1370 1373 case( VT_R4 ): 1371 res = VarDateFromR4( ps->u.fltVal, &(pd->u.date) );1374 res = VarDateFromR4( V_UNION(ps,fltVal), &V_UNION(pd,date) ); 1372 1375 break; 1373 1376 case( VT_R8 ): 1374 res = VarDateFromR8( ps->u.dblVal, &(pd->u.date) );1377 res = VarDateFromR8( V_UNION(ps,dblVal), &V_UNION(pd,date) ); 1375 1378 break; 1376 1379 case( VT_DATE ): … … 1378 1381 break; 1379 1382 case( VT_BOOL ): 1380 res = VarDateFromBool( ps->u.boolVal, &(pd->u.date) );1383 res = VarDateFromBool( V_UNION(ps,boolVal), &V_UNION(pd,date) ); 1381 1384 break; 1382 1385 case( VT_BSTR ): 1383 res = VarDateFromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.date) );1386 res = VarDateFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,date) ); 1384 1387 break; 1385 1388 case( VT_CY ): 1386 res = VarDateFromCy( ps->u.cyVal, &(pd->u.date) ); 1389 res = VarDateFromCy( V_UNION(ps,cyVal), &V_UNION(pd,date) ); 1390 break; 1387 1391 case( VT_DISPATCH ): 1388 /*res = VarDateFromDisp32( ps->u.pdispVal, lcid, &(pd->u.date) );*/ 1392 /*res = VarDateFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,date) );*/ 1393 case( VT_DECIMAL ): 1394 /*res = VarDateFromDec( V_UNION(ps,deiVal), &V_UNION(pd,date) );*/ 1389 1395 case( VT_UNKNOWN ): 1390 /*res = VarDateFrom32( ps->u.lVal, &(pd->u.date) );*/1391 case( VT_DECIMAL ):1392 /*res = VarDateFromDec32( ps->u.deiVal, &(pd->u.date) );*/1393 1396 default: 1394 1397 res = DISP_E_TYPEMISMATCH; … … 1402 1405 { 1403 1406 case( VT_I1 ): 1404 res = VarBoolFromI1( ps->u.cVal, &(pd->u.boolVal) );1407 res = VarBoolFromI1( V_UNION(ps,cVal), &V_UNION(pd,boolVal) ); 1405 1408 break; 1406 1409 case( VT_I2 ): 1407 res = VarBoolFromI2( ps->u.iVal, &(pd->u.boolVal) );1410 res = VarBoolFromI2( V_UNION(ps,iVal), &V_UNION(pd,boolVal) ); 1408 1411 break; 1409 1412 case( VT_INT ): 1410 res = VarBoolFromInt( ps->u.intVal, &(pd->u.boolVal) );1413 res = VarBoolFromInt( V_UNION(ps,intVal), &V_UNION(pd,boolVal) ); 1411 1414 break; 1412 1415 case( VT_I4 ): 1413 res = VarBoolFromI4( ps->u.lVal, &(pd->u.boolVal) );1416 res = VarBoolFromI4( V_UNION(ps,lVal), &V_UNION(pd,boolVal) ); 1414 1417 break; 1415 1418 case( VT_UI1 ): 1416 res = VarBoolFromUI1( ps->u.bVal, &(pd->u.boolVal) );1419 res = VarBoolFromUI1( V_UNION(ps,bVal), &V_UNION(pd,boolVal) ); 1417 1420 break; 1418 1421 case( VT_UI2 ): 1419 res = VarBoolFromUI2( ps->u.uiVal, &(pd->u.boolVal) );1422 res = VarBoolFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,boolVal) ); 1420 1423 break; 1421 1424 case( VT_UINT ): 1422 res = VarBoolFromUint( ps->u.uintVal, &(pd->u.boolVal) );1425 res = VarBoolFromUint( V_UNION(ps,uintVal), &V_UNION(pd,boolVal) ); 1423 1426 break; 1424 1427 case( VT_UI4 ): 1425 res = VarBoolFromUI4( ps->u.ulVal, &(pd->u.boolVal) );1428 res = VarBoolFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,boolVal) ); 1426 1429 break; 1427 1430 case( VT_R4 ): 1428 res = VarBoolFromR4( ps->u.fltVal, &(pd->u.boolVal) );1431 res = VarBoolFromR4( V_UNION(ps,fltVal), &V_UNION(pd,boolVal) ); 1429 1432 break; 1430 1433 case( VT_R8 ): 1431 res = VarBoolFromR8( ps->u.dblVal, &(pd->u.boolVal) );1434 res = VarBoolFromR8( V_UNION(ps,dblVal), &V_UNION(pd,boolVal) ); 1432 1435 break; 1433 1436 case( VT_DATE ): 1434 res = VarBoolFromDate( ps->u.date, &(pd->u.boolVal) );1437 res = VarBoolFromDate( V_UNION(ps,date), &V_UNION(pd,boolVal) ); 1435 1438 break; 1436 1439 case( VT_BOOL ): … … 1438 1441 break; 1439 1442 case( VT_BSTR ): 1440 res = VarBoolFromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.boolVal) );1443 res = VarBoolFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,boolVal) ); 1441 1444 break; 1442 1445 case( VT_CY ): 1443 res = VarBoolFromCy( ps->u.cyVal, &(pd->u.boolVal) ); 1446 res = VarBoolFromCy( V_UNION(ps,cyVal), &V_UNION(pd,boolVal) ); 1447 break; 1444 1448 case( VT_DISPATCH ): 1445 /*res = VarBoolFromDisp32( ps->u.pdispVal, lcid, &(pd->u.boolVal) );*/ 1449 /*res = VarBoolFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,boolVal) );*/ 1450 case( VT_DECIMAL ): 1451 /*res = VarBoolFromDec( V_UNION(ps,deiVal), &V_UNION(pd,boolVal) );*/ 1446 1452 case( VT_UNKNOWN ): 1447 /*res = VarBoolFrom32( ps->u.lVal, &(pd->u.boolVal) );*/1448 case( VT_DECIMAL ):1449 /*res = VarBoolFromDec32( ps->u.deiVal, &(pd->u.boolVal) );*/1450 1453 default: 1451 1454 res = DISP_E_TYPEMISMATCH; … … 1459 1462 { 1460 1463 case( VT_EMPTY ): 1461 if (( pd->u.bstrVal= SysAllocStringLen(NULL, 0)))1464 if ((V_UNION(pd,bstrVal) = SysAllocStringLen(NULL, 0))) 1462 1465 res = S_OK; 1463 1466 else … … 1465 1468 break; 1466 1469 case( VT_I1 ): 1467 res = VarBstrFromI1( ps->u.cVal, lcid, dwFlags, &(pd->u.bstrVal) );1470 res = VarBstrFromI1( V_UNION(ps,cVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1468 1471 break; 1469 1472 case( VT_I2 ): 1470 res = VarBstrFromI2( ps->u.iVal, lcid, dwFlags, &(pd->u.bstrVal) );1473 res = VarBstrFromI2( V_UNION(ps,iVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1471 1474 break; 1472 1475 case( VT_INT ): 1473 res = VarBstrFromInt( ps->u.intVal, lcid, dwFlags, &(pd->u.bstrVal) );1476 res = VarBstrFromInt( V_UNION(ps,intVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1474 1477 break; 1475 1478 case( VT_I4 ): 1476 res = VarBstrFromI4( ps->u.lVal, lcid, dwFlags, &(pd->u.bstrVal) );1479 res = VarBstrFromI4( V_UNION(ps,lVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1477 1480 break; 1478 1481 case( VT_UI1 ): 1479 res = VarBstrFromUI1( ps->u.bVal, lcid, dwFlags, &(pd->u.bstrVal) );1482 res = VarBstrFromUI1( V_UNION(ps,bVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1480 1483 break; 1481 1484 case( VT_UI2 ): 1482 res = VarBstrFromUI2( ps->u.uiVal, lcid, dwFlags, &(pd->u.bstrVal) );1485 res = VarBstrFromUI2( V_UNION(ps,uiVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1483 1486 break; 1484 1487 case( VT_UINT ): 1485 res = VarBstrFromUint( ps->u.uintVal, lcid, dwFlags, &(pd->u.bstrVal) );1488 res = VarBstrFromUint( V_UNION(ps,uintVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1486 1489 break; 1487 1490 case( VT_UI4 ): 1488 res = VarBstrFromUI4( ps->u.ulVal, lcid, dwFlags, &(pd->u.bstrVal) );1491 res = VarBstrFromUI4( V_UNION(ps,ulVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1489 1492 break; 1490 1493 case( VT_R4 ): 1491 res = VarBstrFromR4( ps->u.fltVal, lcid, dwFlags, &(pd->u.bstrVal) );1494 res = VarBstrFromR4( V_UNION(ps,fltVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1492 1495 break; 1493 1496 case( VT_R8 ): 1494 res = VarBstrFromR8( ps->u.dblVal, lcid, dwFlags, &(pd->u.bstrVal) );1497 res = VarBstrFromR8( V_UNION(ps,dblVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1495 1498 break; 1496 1499 case( VT_DATE ): 1497 res = VarBstrFromDate( ps->u.date, lcid, dwFlags, &(pd->u.bstrVal) );1500 res = VarBstrFromDate( V_UNION(ps,date), lcid, 0, &V_UNION(pd,bstrVal) ); 1498 1501 break; 1499 1502 case( VT_BOOL ): 1500 res = VarBstrFromBool( ps->u.boolVal, lcid, dwFlags, &(pd->u.bstrVal) );1501 break; 1502 1503 1504 1503 res = VarBstrFromBool( V_UNION(ps,boolVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1504 break; 1505 case( VT_BSTR ): 1506 res = VariantCopy( pd, ps ); 1507 break; 1505 1508 case( VT_CY ): 1506 /*res = VarBstrFromCy32( ps->u.cyVal, lcid, dwFlags, &(pd->u.bstrVal) );*/ 1509 res = VarBstrFromCy( V_UNION(ps,cyVal), lcid, 0, &V_UNION(pd,bstrVal) ); 1510 break; 1507 1511 case( VT_DISPATCH ): 1508 /*res = VarBstrFromDisp32( ps->u.pdispVal, lcid, lcid, dwFlags, &(pd->u.bstrVal) );*/ 1512 /*res = VarBstrFromDisp( V_UNION(ps,pdispVal), lcid, 0, &(pd,bstrVal) );*/ 1513 case( VT_DECIMAL ): 1514 /*res = VarBstrFromDec( V_UNION(ps,deiVal), lcid, 0, &(pd,bstrVal) );*/ 1509 1515 case( VT_UNKNOWN ): 1510 /*res = VarBstrFrom32( ps->u.lVal, lcid, dwFlags, &(pd->u.bstrVal) );*/1511 case( VT_DECIMAL ):1512 /*res = VarBstrFromDec32( ps->u.deiVal, lcid, dwFlags, &(pd->u.bstrVal) );*/1513 1516 default: 1514 1517 res = DISP_E_TYPEMISMATCH; … … 1522 1525 { 1523 1526 case( VT_I1 ): 1524 res = VarCyFromI1( ps->u.cVal, &(pd->u.cyVal) );1527 res = VarCyFromI1( V_UNION(ps,cVal), &V_UNION(pd,cyVal) ); 1525 1528 break; 1526 1529 case( VT_I2 ): 1527 res = VarCyFromI2( ps->u.iVal, &(pd->u.cyVal) );1530 res = VarCyFromI2( V_UNION(ps,iVal), &V_UNION(pd,cyVal) ); 1528 1531 break; 1529 1532 case( VT_INT ): 1530 res = VarCyFromInt( ps->u.intVal, &(pd->u.cyVal) );1533 res = VarCyFromInt( V_UNION(ps,intVal), &V_UNION(pd,cyVal) ); 1531 1534 break; 1532 1535 case( VT_I4 ): 1533 res = VarCyFromI4( ps->u.lVal, &(pd->u.cyVal) );1536 res = VarCyFromI4( V_UNION(ps,lVal), &V_UNION(pd,cyVal) ); 1534 1537 break; 1535 1538 case( VT_UI1 ): 1536 res = VarCyFromUI1( ps->u.bVal, &(pd->u.cyVal) );1539 res = VarCyFromUI1( V_UNION(ps,bVal), &V_UNION(pd,cyVal) ); 1537 1540 break; 1538 1541 case( VT_UI2 ): 1539 res = VarCyFromUI2( ps->u.uiVal, &(pd->u.cyVal) );1542 res = VarCyFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cyVal) ); 1540 1543 break; 1541 1544 case( VT_UINT ): 1542 res = VarCyFromUint( ps->u.uintVal, &(pd->u.cyVal) );1545 res = VarCyFromUint( V_UNION(ps,uintVal), &V_UNION(pd,cyVal) ); 1543 1546 break; 1544 1547 case( VT_UI4 ): 1545 res = VarCyFromUI4( ps->u.ulVal, &(pd->u.cyVal) );1548 res = VarCyFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cyVal) ); 1546 1549 break; 1547 1550 case( VT_R4 ): 1548 res = VarCyFromR4( ps->u.fltVal, &(pd->u.cyVal) );1551 res = VarCyFromR4( V_UNION(ps,fltVal), &V_UNION(pd,cyVal) ); 1549 1552 break; 1550 1553 case( VT_R8 ): 1551 res = VarCyFromR8( ps->u.dblVal, &(pd->u.cyVal) );1554 res = VarCyFromR8( V_UNION(ps,dblVal), &V_UNION(pd,cyVal) ); 1552 1555 break; 1553 1556 case( VT_DATE ): 1554 res = VarCyFromDate( ps->u.date, &(pd->u.cyVal) );1557 res = VarCyFromDate( V_UNION(ps,date), &V_UNION(pd,cyVal) ); 1555 1558 break; 1556 1559 case( VT_BOOL ): 1557 res = VarCyFromBool( ps->u.date, &(pd->u.cyVal) );1560 res = VarCyFromBool( V_UNION(ps,date), &V_UNION(pd,cyVal) ); 1558 1561 break; 1559 1562 case( VT_CY ): … … 1561 1564 break; 1562 1565 case( VT_BSTR ): 1563 /*res = VarCyFromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.cyVal) );*/ 1566 res = VarCyFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cyVal) ); 1567 break; 1564 1568 case( VT_DISPATCH ): 1565 /*res = VarCyFromDisp32( ps->u.pdispVal, lcid, &(pd->u.boolVal) );*/ 1569 /*res = VarCyFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cyVal) );*/ 1570 case( VT_DECIMAL ): 1571 /*res = VarCyFromDec( V_UNION(ps,deiVal), &V_UNION(pd,cyVal) );*/ 1572 break; 1566 1573 case( VT_UNKNOWN ): 1567 /*res = VarCyFrom32( ps->u.lVal, &(pd->u.boolVal) );*/1568 case( VT_DECIMAL ):1569 /*res = VarCyFromDec32( ps->u.deiVal, &(pd->u.boolVal) );*/1570 1574 default: 1571 1575 res = DISP_E_TYPEMISMATCH; … … 1684 1688 1685 1689 memset(pvarg, 0, sizeof (VARIANTARG)); 1686 pvarg->vt= VT_EMPTY;1690 V_VT(pvarg) = VT_EMPTY; 1687 1691 1688 1692 return; … … 1702 1706 TRACE("(%p)\n",pvarg); 1703 1707 1704 res = ValidateVariantType( pvarg->vt);1708 res = ValidateVariantType( V_VT(pvarg) ); 1705 1709 if( res == S_OK ) 1706 1710 { 1707 if( !( pvarg->vt& VT_BYREF ) )1711 if( !( V_VT(pvarg) & VT_BYREF ) ) 1708 1712 { 1709 1713 /* 1710 1714 * The VT_ARRAY flag is a special case of a safe array. 1711 1715 */ 1712 if ( ( pvarg->vt& VT_ARRAY) != 0)1716 if ( (V_VT(pvarg) & VT_ARRAY) != 0) 1713 1717 { 1714 SafeArrayDestroy( pvarg->u.parray);1718 SafeArrayDestroy(V_UNION(pvarg,parray)); 1715 1719 } 1716 1720 else 1717 1721 { 1718 switch( pvarg->vt& VT_TYPEMASK )1722 switch( V_VT(pvarg) & VT_TYPEMASK ) 1719 1723 { 1720 1724 case( VT_BSTR ): 1721 SysFreeString( pvarg->u.bstrVal);1725 SysFreeString( V_UNION(pvarg,bstrVal) ); 1722 1726 break; 1723 1727 case( VT_DISPATCH ): 1724 if( pvarg->u.pdispVal!=NULL)1725 ICOM_CALL(Release, pvarg->u.pdispVal);1728 if(V_UNION(pvarg,pdispVal)!=NULL) 1729 ICOM_CALL(Release,V_UNION(pvarg,pdispVal)); 1726 1730 break; 1727 1731 case( VT_VARIANT ): 1728 VariantClear( pvarg->u.pvarVal);1732 VariantClear(V_UNION(pvarg,pvarVal)); 1729 1733 break; 1730 1734 case( VT_UNKNOWN ): 1731 if( pvarg->u.punkVal!=NULL)1732 ICOM_CALL(Release, pvarg->u.punkVal);1735 if(V_UNION(pvarg,punkVal)!=NULL) 1736 ICOM_CALL(Release,V_UNION(pvarg,punkVal)); 1733 1737 break; 1734 1738 case( VT_SAFEARRAY ): 1735 SafeArrayDestroy( pvarg->u.parray);1739 SafeArrayDestroy(V_UNION(pvarg,parray)); 1736 1740 break; 1737 1741 default: … … 1745 1749 */ 1746 1750 memset(pvarg, 0, sizeof (VARIANTARG)); 1747 pvarg->vt= VT_EMPTY;1751 V_VT(pvarg) = VT_EMPTY; 1748 1752 } 1749 1753 … … 1762 1766 TRACE("(%p, %p)\n", pvargDest, pvargSrc); 1763 1767 1764 res = ValidateVariantType( pvargSrc->vt);1768 res = ValidateVariantType( V_VT(pvargSrc) ); 1765 1769 1766 1770 /* If the pointer are to the same variant we don't need … … 1773 1777 if( res == S_OK ) 1774 1778 { 1775 if( pvargSrc->vt& VT_BYREF )1779 if( V_VT(pvargSrc) & VT_BYREF ) 1776 1780 { 1777 1781 /* In the case of byreference we only need 1778 1782 * to copy the pointer. 1779 1783 */ 1780 pvargDest-> u = pvargSrc->u;1781 pvargDest->vt = pvargSrc->vt;1784 pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3; 1785 V_VT(pvargDest) = V_VT(pvargSrc); 1782 1786 } 1783 1787 else … … 1786 1790 * The VT_ARRAY flag is another way to designate a safe array. 1787 1791 */ 1788 if ( pvargSrc->vt& VT_ARRAY)1789 { 1790 SafeArrayCopy( pvargSrc->u.parray, &pvargDest->u.parray);1792 if (V_VT(pvargSrc) & VT_ARRAY) 1793 { 1794 SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray)); 1791 1795 } 1792 1796 else … … 1798 1802 * called to increment the object's reference count. 1799 1803 */ 1800 switch( pvargSrc->vt& VT_TYPEMASK )1804 switch( V_VT(pvargSrc) & VT_TYPEMASK ) 1801 1805 { 1802 1806 case( VT_BSTR ): 1803 pvargDest->u.bstrVal = SysAllocString( pvargSrc->u.bstrVal);1807 V_UNION(pvargDest,bstrVal) = SysAllocString( V_UNION(pvargSrc,bstrVal) ); 1804 1808 break; 1805 1809 case( VT_DISPATCH ): 1806 pvargDest->u.pdispVal = pvargSrc->u.pdispVal;1807 if ( pvargDest->u.pdispVal!=NULL)1808 ICOM_CALL(AddRef, pvargDest->u.pdispVal);1810 V_UNION(pvargDest,pdispVal) = V_UNION(pvargSrc,pdispVal); 1811 if (V_UNION(pvargDest,pdispVal)!=NULL) 1812 ICOM_CALL(AddRef,V_UNION(pvargDest,pdispVal)); 1809 1813 break; 1810 1814 case( VT_VARIANT ): 1811 VariantCopy( pvargDest->u.pvarVal,pvargSrc->u.pvarVal);1815 VariantCopy(V_UNION(pvargDest,pvarVal),V_UNION(pvargSrc,pvarVal)); 1812 1816 break; 1813 1817 case( VT_UNKNOWN ): 1814 pvargDest->u.punkVal = pvargSrc->u.punkVal;1815 if ( pvargDest->u.pdispVal!=NULL)1816 ICOM_CALL(AddRef, pvargDest->u.punkVal);1818 V_UNION(pvargDest,punkVal) = V_UNION(pvargSrc,punkVal); 1819 if (V_UNION(pvargDest,pdispVal)!=NULL) 1820 ICOM_CALL(AddRef,V_UNION(pvargDest,punkVal)); 1817 1821 break; 1818 1822 case( VT_SAFEARRAY ): 1819 SafeArrayCopy( pvargSrc->u.parray, &pvargDest->u.parray);1823 SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray)); 1820 1824 break; 1821 1825 default: 1822 pvargDest-> u = pvargSrc->u;1826 pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3; 1823 1827 break; 1824 1828 } 1825 1829 } 1826 1830 1827 pvargDest->vt = pvargSrc->vt;1831 V_VT(pvargDest) = V_VT(pvargSrc); 1828 1832 } 1829 1833 } … … 1846 1850 TRACE("(%p, %p)\n", pvargDest, pvargSrc); 1847 1851 1848 res = ValidateVariantType( pvargSrc->vt);1852 res = ValidateVariantType( V_VT(pvargSrc) ); 1849 1853 1850 1854 if( res != S_OK ) 1851 1855 return res; 1852 1856 1853 if( pvargSrc->vt& VT_BYREF )1857 if( V_VT(pvargSrc) & VT_BYREF ) 1854 1858 { 1855 1859 VARIANTARG varg; … … 1875 1879 * The VT_ARRAY flag is another way to designate a safearray variant. 1876 1880 */ 1877 if ( pvargSrc->vt& VT_ARRAY)1878 { 1879 SafeArrayCopy(* pvargSrc->u.pparray, &pvargDest->u.parray);1881 if ( V_VT(pvargSrc) & VT_ARRAY) 1882 { 1883 SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray)); 1880 1884 } 1881 1885 else … … 1887 1891 /* Get the variant type. 1888 1892 */ 1889 switch( pvargSrc->vt& VT_TYPEMASK )1893 switch( V_VT(pvargSrc) & VT_TYPEMASK ) 1890 1894 { 1891 1895 case( VT_BSTR ): 1892 pvargDest->u.bstrVal = SysAllocString( *(pvargSrc->u.pbstrVal) );1896 V_UNION(pvargDest,bstrVal) = SysAllocString( *(V_UNION(pvargSrc,pbstrVal)) ); 1893 1897 break; 1894 1898 case( VT_DISPATCH ): … … 1903 1907 * returned. 1904 1908 */ 1905 if( pvargSrc-> wReserved1 & PROCESSING_INNER_VARIANT )1909 if( pvargSrc->n1.n2.wReserved1 & PROCESSING_INNER_VARIANT ) 1906 1910 { 1907 1911 /* If we get here we are attempting to deference … … 1917 1921 * that will be passed to the VariantCopyInd function. 1918 1922 */ 1919 ( pvargSrc->u.pvarVal)->wReserved1 |= PROCESSING_INNER_VARIANT;1923 (V_UNION(pvargSrc,pvarVal))->n1.n2.wReserved1 |= PROCESSING_INNER_VARIANT; 1920 1924 1921 1925 /* Dereference the inner variant. 1922 1926 */ 1923 res = VariantCopyInd( pvargDest, pvargSrc->u.pvarVal);1927 res = VariantCopyInd( pvargDest, V_UNION(pvargSrc,pvarVal) ); 1924 1928 /* We must also copy its type, I think. 1925 1929 */ 1926 pvargSrc->vt = pvargSrc->u.pvarVal->vt;1930 V_VT(pvargSrc) = V_VT(V_UNION(pvargSrc,pvarVal)); 1927 1931 } 1928 1932 } … … 1931 1935 break; 1932 1936 case( VT_SAFEARRAY ): 1933 SafeArrayCopy(* pvargSrc->u.pparray, &pvargDest->u.parray);1937 SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray)); 1934 1938 break; 1935 1939 default: 1936 1940 /* This is a by reference Variant which means that the union 1937 1941 * part of the Variant contains a pointer to some data of 1938 * type " pvargSrc->vt& VT_TYPEMASK".1942 * type "V_VT(pvargSrc) & VT_TYPEMASK". 1939 1943 * We will deference this data in a generic fashion using 1940 1944 * the void pointer "Variant.u.byref". … … 1942 1946 * Variant. 1943 1947 */ 1944 memcpy( &pvargDest-> u, pvargSrc->u.byref, SizeOfVariantData( pvargSrc ) );1948 memcpy( &pvargDest->n1.n2, V_UNION(pvargSrc,byref), SizeOfVariantData( pvargSrc ) ); 1945 1949 break; 1946 1950 } 1947 1951 } 1948 1952 1949 pvargDest->vt = pvargSrc->vt& VT_TYPEMASK;1953 V_VT(pvargDest) = V_VT(pvargSrc) & VT_TYPEMASK; 1950 1954 } 1951 1955 } … … 1986 1990 /* validate our source argument. 1987 1991 */ 1988 res = ValidateVariantType( pvargSrc->vt);1992 res = ValidateVariantType( V_VT(pvargSrc) ); 1989 1993 1990 1994 /* validate the vartype. … … 2012 2016 if( res == S_OK ) 2013 2017 { 2014 if( pvargSrc->vt& VT_BYREF )2018 if( V_VT(pvargSrc) & VT_BYREF ) 2015 2019 { 2016 2020 /* Convert the source variant to a "byvalue" variant. … … 2042 2046 */ 2043 2047 if ( res == S_OK ) 2044 pvargDest->vt= vt;2048 V_VT(pvargDest) = vt; 2045 2049 2046 2050 return res; … … 2213 2217 2214 2218 /****************************************************************************** 2215 * VarUI1FromStr [OLEAUT32. 54]2219 * VarUI1FromStr [OLEAUT32.136] 2216 2220 */ 2217 2221 HRESULT WINAPI VarUI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, BYTE* pbOut) … … 2369 2373 2370 2374 /****************************************************************************** 2371 * VarI2FromI1 [OLEAUT32. 48]2375 * VarI2FromI1 [OLEAUT32.205] 2372 2376 */ 2373 2377 HRESULT WINAPI VarI2FromI1(CHAR cIn, short* psOut) … … 2400 2404 2401 2405 /****************************************************************************** 2402 * VarI2FromUI4 [OLEAUT32. 49]2406 * VarI2FromUI4 [OLEAUT32.207] 2403 2407 */ 2404 2408 HRESULT WINAPI VarI2FromUI4(ULONG ulIn, short* psOut) … … 2836 2840 2837 2841 /****************************************************************************** 2838 * VarR8FromUI1 [OLEAUT32. 68]2842 * VarR8FromUI1 [OLEAUT32.78] 2839 2843 */ 2840 2844 HRESULT WINAPI VarR8FromUI1(BYTE bIn, double* pdblOut) … … 2848 2852 2849 2853 /****************************************************************************** 2850 * VarR8FromI2 [OLEAUT32. 69]2854 * VarR8FromI2 [OLEAUT32.79] 2851 2855 */ 2852 2856 HRESULT WINAPI VarR8FromI2(short sIn, double* pdblOut) … … 2860 2864 2861 2865 /****************************************************************************** 2862 * VarR8FromI4 [OLEAUT32. 70]2866 * VarR8FromI4 [OLEAUT32.80] 2863 2867 */ 2864 2868 HRESULT WINAPI VarR8FromI4(LONG lIn, double* pdblOut) … … 2986 2990 2987 2991 /****************************************************************************** 2988 * VarDateFromUI1 [OLEAUT32. ]2992 * VarDateFromUI1 [OLEAUT32.88] 2989 2993 */ 2990 2994 HRESULT WINAPI VarDateFromUI1(BYTE bIn, DATE* pdateOut) … … 2998 3002 2999 3003 /****************************************************************************** 3000 * VarDateFromI2 [OLEAUT32. 222]3004 * VarDateFromI2 [OLEAUT32.89] 3001 3005 */ 3002 3006 HRESULT WINAPI VarDateFromI2(short sIn, DATE* pdateOut) … … 3094 3098 TRACE("( %p, %lx, %lx, %p ), stub\n", strIn, lcid, dwFlags, pdateOut ); 3095 3099 3096 if( DateTimeStringToTm( strIn, lcid, &TM ) )3100 if( DateTimeStringToTm( strIn, dwFlags, &TM ) ) 3097 3101 { 3098 3102 if( TmToDATE( &TM, pdateOut ) == FALSE ) … … 3256 3260 * 3257 3261 * The date is implemented using an 8 byte floating-point number. 3258 * Days are represented by whole numbers increments starting with 0.00 has3262 * Days are represented by whole numbers increments starting with 0.00 as 3259 3263 * being December 30 1899, midnight. 3260 3264 * The hours are expressed as the fractional part of the number. … … 3288 3292 TRACE("( %f, %ld, %ld, %p ), stub\n", dateIn, lcid, dwFlags, pbstrOut ); 3289 3293 3290 if( DateToTm( dateIn, lcid, &TM ) == FALSE )3294 if( DateToTm( dateIn, dwFlags, &TM ) == FALSE ) 3291 3295 { 3292 3296 return E_INVALIDARG; … … 4286 4290 * Convert signed char to currency 4287 4291 */ 4288 HRESULT WINAPI VarCyFromI1( CHARcIn, CY* pcyOut) {4292 HRESULT WINAPI VarCyFromI1(signed char cIn, CY* pcyOut) { 4289 4293 if (cIn < 0) pcyOut->s.Hi = -1; 4290 4294 else pcyOut->s.Hi = 0; … … 4341 4345 } 4342 4346 4347 4348 /********************************************************************** 4349 * VarParseNumFromStr [OLEAUT32.46] 4350 */ 4351 HRESULT WINAPI VarParseNumFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, 4352 NUMPARSE * pnumprs, BYTE * rgbDig) 4353 { 4354 int i,lastent=0; 4355 int cDig; 4356 FIXME("(%s,flags=%lx,....), partial stub!\n",debugstr_w(strIn),dwFlags); 4357 FIXME("numparse: cDig=%d, InFlags=%lx\n",pnumprs->cDig,pnumprs->dwInFlags); 4358 4359 /* The other struct components are to be set by us */ 4360 4361 memset(rgbDig,0,pnumprs->cDig); 4362 4363 cDig = 0; 4364 for (i=0; strIn[i] ;i++) { 4365 if ((strIn[i]>='0') && (strIn[i]<='9')) { 4366 if (pnumprs->cDig > cDig) { 4367 *(rgbDig++)=strIn[i]-'0'; 4368 cDig++; 4369 lastent = i; 4370 } 4371 } 4372 } 4373 pnumprs->cDig = cDig; 4374 4375 /* FIXME: Just patching some values in */ 4376 pnumprs->nPwr10 = 0; 4377 pnumprs->nBaseShift = 0; 4378 pnumprs->cchUsed = lastent; 4379 pnumprs->dwOutFlags = NUMPRS_DECIMAL; 4380 return S_OK; 4381 } 4382 4383 4384 /********************************************************************** 4385 * VarNumFromParseNum [OLEAUT32.47] 4386 */ 4387 HRESULT WINAPI VarNumFromParseNum(NUMPARSE * pnumprs, BYTE * rgbDig, 4388 ULONG dwVtBits, VARIANT * pvar) 4389 { 4390 DWORD xint; 4391 int i; 4392 FIXME("(,dwVtBits=%lx,....), partial stub!\n",dwVtBits); 4393 4394 xint = 0; 4395 for (i=0;i<pnumprs->cDig;i++) 4396 xint = xint*10 + rgbDig[i]; 4397 4398 VariantInit(pvar); 4399 if (dwVtBits & VTBIT_I4) { 4400 V_VT(pvar) = VT_I4; 4401 V_UNION(pvar,intVal) = xint; 4402 return S_OK; 4403 } 4404 if (dwVtBits & VTBIT_R8) { 4405 V_VT(pvar) = VT_R8; 4406 V_UNION(pvar,dblVal) = xint; 4407 return S_OK; 4408 } else { 4409 FIXME("vtbitmask is unsupported %lx\n",dwVtBits); 4410 return E_FAIL; 4411 } 4412 } 4413 4414 4415 /********************************************************************** 4416 * VariantTimeToDosDateTime [OLEAUT32.??] 4417 * Convert variant representation of time to the date and time representation 4418 * stored in dos. 4419 */ 4420 INT WINAPI VariantTimeToDosDateTime(DATE pvtime, USHORT *wDosDate, USHORT *wDosTime) 4421 { 4422 struct tm t; 4423 wDosTime = 0; 4424 wDosDate = 0; 4425 4426 TRACE("( 0x%x, 0x%x, 0x%p ), stub\n", *wDosDate, *wDosTime, &pvtime ); 4427 4428 if (DateToTm(pvtime, 0, &t) < 0) return 0; 4429 4430 *wDosTime = *wDosTime | (t.tm_sec / 2); 4431 *wDosTime = *wDosTime | (t.tm_min << 5); 4432 *wDosTime = *wDosTime | (t.tm_hour << 11); 4433 4434 *wDosDate = *wDosDate | t.tm_mday ; 4435 *wDosDate = *wDosDate | t.tm_mon << 5; 4436 *wDosDate = *wDosDate | ((t.tm_year - 1980) << 9) ; 4437 4438 return 1; 4439 } 4440 4441 4442 HRESULT WINAPI SystemTimeToVariantTime( LPSYSTEMTIME lpSystemTime, double *pvtime ) 4443 { 4444 static const BYTE Days_Per_Month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 4445 static const BYTE Days_Per_Month_LY[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 4446 4447 struct tm t; 4448 4449 TRACE(" %d/%d/%d %d:%d:%d\n", 4450 lpSystemTime->wMonth, lpSystemTime->wDay, 4451 lpSystemTime->wYear, lpSystemTime->wHour, 4452 lpSystemTime->wMinute, lpSystemTime->wSecond); 4453 4454 if (lpSystemTime->wYear >= 1900) 4455 { 4456 t.tm_sec = lpSystemTime->wSecond; 4457 t.tm_min = lpSystemTime->wMinute; 4458 t.tm_hour = lpSystemTime->wHour; 4459 4460 t.tm_mday = lpSystemTime->wDay; 4461 t.tm_mon = lpSystemTime->wMonth; 4462 t.tm_year = lpSystemTime->wYear; 4463 4464 return TmToDATE( &t, pvtime ); 4465 } 4466 else 4467 { 4468 t.tm_sec = lpSystemTime->wSecond; 4469 t.tm_min = lpSystemTime->wMinute; 4470 t.tm_hour = lpSystemTime->wHour; 4471 4472 if (isleap(lpSystemTime->wYear) ) 4473 t.tm_mday = Days_Per_Month_LY[13 - lpSystemTime->wMonth] - lpSystemTime->wDay; 4474 else 4475 t.tm_mday = Days_Per_Month[13 - lpSystemTime->wMonth] - lpSystemTime->wDay; 4476 4477 t.tm_mon = 13 - lpSystemTime->wMonth; 4478 t.tm_year = 1900 + 1899 - lpSystemTime->wYear; 4479 4480 TmToDATE( &t, pvtime ); 4481 4482 *pvtime *= -1; 4483 4484 return 1; 4485 } 4486 4487 return 0; 4488 } 4489 4490 HRESULT WINAPI VariantTimeToSystemTime( double vtime, LPSYSTEMTIME lpSystemTime ) 4491 { 4492 double t = 0, timeofday = 0; 4493 4494 static const BYTE Days_Per_Month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 4495 static const BYTE Days_Per_Month_LY[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 4496 4497 /* The Month_Code is used to find the Day of the Week (LY = LeapYear)*/ 4498 static const BYTE Month_Code[] = {0, 1, 4, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6}; 4499 static const BYTE Month_Code_LY[] = {0, 0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6}; 4500 4501 /* The Century_Code is used to find the Day of the Week */ 4502 static const BYTE Century_Code[] = {0, 6, 4, 2}; 4503 4504 struct tm r; 4505 4506 TRACE(" Variant = %f SYSTEMTIME ptr %p", vtime, lpSystemTime); 4507 4508 if (vtime >= 0) 4509 { 4510 4511 if (DateToTm(vtime, 0, &r ) <= 0) return 0; 4512 4513 lpSystemTime->wSecond = r.tm_sec; 4514 lpSystemTime->wMinute = r.tm_min; 4515 lpSystemTime->wHour = r.tm_hour; 4516 lpSystemTime->wDay = r.tm_mday; 4517 lpSystemTime->wMonth = r.tm_mon; 4518 4519 if (lpSystemTime->wMonth == 12) 4520 lpSystemTime->wMonth = 1; 4521 else 4522 lpSystemTime->wMonth++; 4523 4524 lpSystemTime->wYear = r.tm_year; 4525 } 4526 else 4527 { 4528 vtime = -1*vtime; 4529 4530 if (DateToTm(vtime, 0, &r ) <= 0) return 0; 4531 4532 lpSystemTime->wSecond = r.tm_sec; 4533 lpSystemTime->wMinute = r.tm_min; 4534 lpSystemTime->wHour = r.tm_hour; 4535 4536 lpSystemTime->wMonth = 13 - r.tm_mon; 4537 4538 if (lpSystemTime->wMonth == 1) 4539 lpSystemTime->wMonth = 12; 4540 else 4541 lpSystemTime->wMonth--; 4542 4543 lpSystemTime->wYear = 1899 - (r.tm_year - 1900); 4544 4545 if (!isleap(lpSystemTime->wYear) ) 4546 lpSystemTime->wDay = Days_Per_Month[13 - lpSystemTime->wMonth] - r.tm_mday; 4547 else 4548 lpSystemTime->wDay = Days_Per_Month_LY[13 - lpSystemTime->wMonth] - r.tm_mday; 4549 4550 4551 } 4552 4553 if (!isleap(lpSystemTime->wYear)) 4554 { 4555 /* 4556 (Century_Code+Month_Code+Year_Code+Day) % 7 4557 4558 The century code repeats every 400 years , so the array 4559 works out like this, 4560 4561 Century_Code[0] is for 16th/20th Centry 4562 Century_Code[1] is for 17th/21th Centry 4563 Century_Code[2] is for 18th/22th Centry 4564 Century_Code[3] is for 19th/23th Centry 4565 4566 The year code is found with the formula (year + (year / 4)) 4567 the "year" must be between 0 and 99 . 4568 4569 The Month Code (Month_Code[1]) starts with January and 4570 ends with December. 4571 */ 4572 4573 lpSystemTime->wDayOfWeek = ( 4574 Century_Code[(( (lpSystemTime->wYear+100) - lpSystemTime->wYear%100) /100) %4]+ 4575 ((lpSystemTime->wYear%100)+(lpSystemTime->wYear%100)/4)+ 4576 Month_Code[lpSystemTime->wMonth]+ 4577 lpSystemTime->wDay) % 7; 4578 4579 if (lpSystemTime->wDayOfWeek == 0) lpSystemTime->wDayOfWeek = 7; 4580 else lpSystemTime->wDayOfWeek -= 1; 4581 } 4582 else 4583 { 4584 lpSystemTime->wDayOfWeek = ( 4585 Century_Code[(((lpSystemTime->wYear+100) - lpSystemTime->wYear%100)/100)%4]+ 4586 ((lpSystemTime->wYear%100)+(lpSystemTime->wYear%100)/4)+ 4587 Month_Code_LY[lpSystemTime->wMonth]+ 4588 lpSystemTime->wDay) % 7; 4589 4590 if (lpSystemTime->wDayOfWeek == 0) lpSystemTime->wDayOfWeek = 7; 4591 else lpSystemTime->wDayOfWeek -= 1; 4592 } 4593 4594 t = floor(vtime); 4595 timeofday = vtime - t; 4596 4597 lpSystemTime->wMilliseconds = (timeofday 4598 - lpSystemTime->wHour*(1/24) 4599 - lpSystemTime->wMinute*(1/1440) 4600 - lpSystemTime->wSecond*(1/86400) )*(1/5184000); 4601 4602 return 1; 4603 } 4604 4605 HRESULT WINAPI VarUdateFromDate( DATE datein, ULONG dwFlags, UDATE *pudateout) 4606 { 4607 HRESULT i = 0; 4608 static const BYTE Days_Per_Month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 4609 static const BYTE Days_Per_Month_LY[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 4610 4611 TRACE("DATE = %f\n", (double)datein); 4612 i = VariantTimeToSystemTime(datein, &(pudateout->st) ); 4613 4614 if (i) 4615 { 4616 pudateout->wDayOfYear = 0; 4617 4618 if (isleap(pudateout->st.wYear)) 4619 { 4620 for (i =1; i<pudateout->st.wMonth; i++) 4621 pudateout->wDayOfYear += Days_Per_Month[i]; 4622 } 4623 else 4624 { 4625 for (i =1; i<pudateout->st.wMonth; i++) 4626 pudateout->wDayOfYear += Days_Per_Month_LY[i]; 4627 } 4628 4629 pudateout->wDayOfYear += pudateout->st.wDay; 4630 dwFlags = 0; /*VAR_VALIDDATE*/ 4631 } 4632 else dwFlags = 0; 4633 4634 return i; 4635 } 4636 4637 HRESULT WINAPI VarDateFromUdate(UDATE *pudateout, 4638 ULONG dwFlags, DATE *datein) 4639 { 4640 HRESULT i; 4641 double t = 0; 4642 TRACE(" %d/%d/%d %d:%d:%d\n", 4643 pudateout->st.wMonth, pudateout->st.wDay, 4644 pudateout->st.wYear, pudateout->st.wHour, 4645 pudateout->st.wMinute, pudateout->st.wSecond); 4646 4647 4648 i = SystemTimeToVariantTime(&(pudateout->st), &t); 4649 *datein = t; 4650 4651 if (i) dwFlags = 0; /*VAR_VALIDDATE*/ 4652 else dwFlags = 0; 4653 4654 return i; 4655 } 4656 4657 4658 /********************************************************************** 4659 * VarBstrCmp [OLEAUT32.440] 4660 * 4661 * flags can be: 4662 * NORM_IGNORECASE, NORM_IGNORENONSPACE, NORM_IGNORESYMBOLS 4663 * NORM_IGNORESTRINGWIDTH, NORM_IGNOREKANATYPE, NORM_IGNOREKASHIDA 4664 * 4665 */ 4666 HRESULT WINAPI VarBstrCmp(BSTR left, BSTR right, LCID lcid, DWORD flags) 4667 { 4668 DWORD r; 4669 4670 FIXME("( %s %s %ld %lx ) partial stub\n", debugstr_w(left), debugstr_w(right), lcid, flags); 4671 4672 if((!left) || (!right)) 4673 return VARCMP_NULL; 4674 4675 if(flags&NORM_IGNORECASE) 4676 r = lstrcmpiW(left,right); 4677 else 4678 r = lstrcmpW(left,right); 4679 4680 if(r<0) 4681 return VARCMP_LT; 4682 if(r>0) 4683 return VARCMP_GT; 4684 4685 return VARCMP_EQ; 4686 } 4687 4688 /********************************************************************** 4689 * VarBstrCat [OLEAUT32.439] 4690 */ 4691 HRESULT WINAPI VarBstrCat(BSTR left, BSTR right, BSTR *out) 4692 { 4693 BSTR result; 4694 4695 TRACE("( %s %s %p )\n", debugstr_w(left), debugstr_w(right), out); 4696 4697 if( (!left) || (!right) || (!out) ) 4698 return 0; 4699 4700 result = SysAllocStringLen(left, lstrlenW(left)+lstrlenW(right)); 4701 lstrcatW(result,right); 4702 4703 *out = result; 4704 4705 return 1; 4706 } 4707
Note:
See TracChangeset
for help on using the changeset viewer.