PATCH: Coercing without flags

Marcus Meissner marcus at jet.franken.de
Sat Aug 18 10:49:19 CDT 2001


Hi,

While debugging my cellphone access app I came across a failing 
VariantChangeTypeEx call, which has a flag of 0x00000002, which passes
it down to VarBstrFromDate(), which is way more confused after this.

Judging from the MSDN documentation the wFlags should not be passed 
down to the lowlevel conversion functions.

Ciao, Marcus

Changelog:
	Do not pass the highlevel wFlags from VariantChangeType* down
	to lowlevel Variant conversion functions.

Index: variant.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v
retrieving revision 1.21
diff -u -r1.21 variant.c
--- variant.c	2001/08/16 18:01:41	1.21
+++ variant.c	2001/08/18 15:49:22
@@ -871,12 +871,16 @@
  *
  * This function dispatches execution to the proper conversion API
  * to do the necessary coercion.
+ *
+ * FIXME: Passing down dwFlags to the conversion functions is wrong, this
+ * 	  is a different flagmask. Check MSDN.
  */
 static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps, VARTYPE vt )
 {
 	HRESULT res = S_OK;
 	unsigned short vtFrom = 0;
 	vtFrom = ps->vt & VT_TYPEMASK;
+
 	
 	/* Note: Since "long" and "int" values both have 4 bytes and are
 	 * both signed integers "int" will be treated as "long" in the
@@ -941,7 +945,7 @@
 			res = VarI1FromBool( ps->u.boolVal, &(pd->u.cVal) );
 			break;
 		case( VT_BSTR ):
-			res = VarI1FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.cVal) );
+			res = VarI1FromStr( ps->u.bstrVal, lcid, 0, &(pd->u.cVal) );
 			break;
 		case( VT_CY ):
 			res = VarI1FromCy( ps->u.cyVal, &(pd->u.cVal) );
@@ -994,7 +998,7 @@
 			res = VarI2FromBool( ps->u.boolVal, &(pd->u.iVal) );
 			break;
 		case( VT_BSTR ):
-			res = VarI2FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.iVal) );
+			res = VarI2FromStr( ps->u.bstrVal, lcid, 0, &(pd->u.iVal) );
 			break;
 		case( VT_CY ):
 			res = VarI2FromCy( ps->u.cyVal, &(pd->u.iVal) );
@@ -1048,7 +1052,7 @@
 			res = VarI4FromBool( ps->u.boolVal, &(pd->u.lVal) );
 			break;
 		case( VT_BSTR ):
-			res = VarI4FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.lVal) );
+			res = VarI4FromStr( ps->u.bstrVal, lcid, 0, &(pd->u.lVal) );
 			break;
 		case( VT_CY ):
 			res = VarI4FromCy( ps->u.cyVal, &(pd->u.lVal) );
@@ -1101,7 +1105,7 @@
 			res = VarUI1FromBool( ps->u.boolVal, &(pd->u.bVal) );
 			break;
 		case( VT_BSTR ):
-			res = VarUI1FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.bVal) );
+			res = VarUI1FromStr( ps->u.bstrVal, lcid, 0, &(pd->u.bVal) );
 			break;
 		case( VT_CY ):
 			res = VarUI1FromCy( ps->u.cyVal, &(pd->u.bVal) );
@@ -1154,7 +1158,7 @@
 			res = VarUI2FromBool( ps->u.boolVal, &(pd->u.uiVal) );
 			break;
 		case( VT_BSTR ):
-			res = VarUI2FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.uiVal) );
+			res = VarUI2FromStr( ps->u.bstrVal, lcid, 0, &(pd->u.uiVal) );
 			break;
 		case( VT_CY ):
 			res = VarUI2FromCy( ps->u.cyVal, &(pd->u.uiVal) );
@@ -1207,7 +1211,7 @@
 			res = VarUI4FromBool( ps->u.boolVal, &(pd->u.ulVal) );
 			break;
 		case( VT_BSTR ):
-			res = VarUI4FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.ulVal) );
+			res = VarUI4FromStr( ps->u.bstrVal, lcid, 0, &(pd->u.ulVal) );
 			break;
 		case( VT_CY ):
 			res = VarUI4FromCy( ps->u.cyVal, &(pd->u.ulVal) );
@@ -1260,7 +1264,7 @@
 			res = VarR4FromBool( ps->u.boolVal, &(pd->u.fltVal) );
 			break;
 		case( VT_BSTR ):
-			res = VarR4FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.fltVal) );
+			res = VarR4FromStr( ps->u.bstrVal, lcid, 0, &(pd->u.fltVal) );
 			break;
 		case( VT_CY ):
 			res = VarR4FromCy( ps->u.cyVal, &(pd->u.fltVal) );
@@ -1313,7 +1317,7 @@
 			res = VarR8FromBool( ps->u.boolVal, &(pd->u.dblVal) );
 			break;
 		case( VT_BSTR ):
-			res = VarR8FromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.dblVal) );
+			res = VarR8FromStr( ps->u.bstrVal, lcid, 0, &(pd->u.dblVal) );
 			break;
 		case( VT_CY ):
 			res = VarR8FromCy( ps->u.cyVal, &(pd->u.dblVal) );
@@ -1370,7 +1374,7 @@
 			res = VarDateFromBool( ps->u.boolVal, &(pd->u.date) );
 			break;
 		case( VT_BSTR ):
-			res = VarDateFromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.date) );
+			res = VarDateFromStr( ps->u.bstrVal, lcid, 0, &(pd->u.date) );
 			break;
 		case( VT_CY ):
 			res = VarDateFromCy( ps->u.cyVal, &(pd->u.date) );
@@ -1427,7 +1431,7 @@
             res = VariantCopy( pd, ps );
             break;
 		case( VT_BSTR ):
-			res = VarBoolFromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.boolVal) );
+			res = VarBoolFromStr( ps->u.bstrVal, lcid, 0, &(pd->u.boolVal) );
 			break;
 		case( VT_CY ):
 			res = VarBoolFromCy( ps->u.cyVal, &(pd->u.boolVal) );
@@ -1454,51 +1458,51 @@
 				res = E_OUTOFMEMORY;
 			break;
 		case( VT_I1 ):
-			res = VarBstrFromI1( ps->u.cVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromI1( ps->u.cVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_I2 ):
-			res = VarBstrFromI2( ps->u.iVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromI2( ps->u.iVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_INT ):
-			res = VarBstrFromInt( ps->u.intVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromInt( ps->u.intVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_I4 ):
-			res = VarBstrFromI4( ps->u.lVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromI4( ps->u.lVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_UI1 ):
-			res = VarBstrFromUI1( ps->u.bVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromUI1( ps->u.bVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_UI2 ):
-			res = VarBstrFromUI2( ps->u.uiVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromUI2( ps->u.uiVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_UINT ):
-			res = VarBstrFromUint( ps->u.uintVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromUint( ps->u.uintVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_UI4 ):
-			res = VarBstrFromUI4( ps->u.ulVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromUI4( ps->u.ulVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_R4 ):
-			res = VarBstrFromR4( ps->u.fltVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromR4( ps->u.fltVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_R8 ):
-			res = VarBstrFromR8( ps->u.dblVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromR8( ps->u.dblVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_DATE ):
-			res = VarBstrFromDate( ps->u.date, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromDate( ps->u.date, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_BOOL ):
-			res = VarBstrFromBool( ps->u.boolVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromBool( ps->u.boolVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_BSTR ):
 			res = VariantCopy( pd, ps );
 			break;
 		case( VT_CY ):
-			res = VarBstrFromCy( ps->u.cyVal, lcid, dwFlags, &(pd->u.bstrVal) );
+			res = VarBstrFromCy( ps->u.cyVal, lcid, 0, &(pd->u.bstrVal) );
 			break;
 		case( VT_DISPATCH ):
-			/*res = VarBstrFromDisp( ps->u.pdispVal, lcid, dwFlags, &(pd->u.bstrVal) );*/
+			/*res = VarBstrFromDisp( ps->u.pdispVal, lcid, 0, &(pd->u.bstrVal) );*/
 		case( VT_DECIMAL ):
-			/*res = VarBstrFromDec( ps->u.deiVal, lcid, dwFlags, &(pd->u.bstrVal) );*/
+			/*res = VarBstrFromDec( ps->u.deiVal, lcid, 0, &(pd->u.bstrVal) );*/
 		case( VT_UNKNOWN ):
 		default:
 			res = DISP_E_TYPEMISMATCH;
@@ -1550,7 +1554,7 @@
 	     res = VariantCopy( pd, ps );
 	     break;
 	  case( VT_BSTR ):
-	     res = VarCyFromStr( ps->u.bstrVal, lcid, dwFlags, &(pd->u.cyVal) );
+	     res = VarCyFromStr( ps->u.bstrVal, lcid, 0, &(pd->u.cyVal) );
 	     break;
 	  case( VT_DISPATCH ):
 	     /*res = VarCyFromDisp( ps->u.pdispVal, lcid, &(pd->u.cyVal) );*/




More information about the wine-patches mailing list