PATCH: copy_arg on itypelib::invoke problem

Marcus Meissner marcus at jet.franken.de
Sun Nov 2 11:07:17 CST 2003


Hi,

Thanks to MikeH for bugging me sufficiently.

This is one InstallShield regression down, the "Error Number: 0x80020008"
(DISP_E_TYPE_MISMATCH) regression.

Ciao, Marcus

Changelog:
	Do not coerce arguments of ITypeLib::Invoke in-place, or we get 
	corrupted variants.
	Handle V_ARRAY | somthing -> VT_SAFEARRAY, as this is a NOP.

Index: dlls/oleaut32/typelib.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib.c,v
retrieving revision 1.102
diff -u -r1.102 typelib.c
--- dlls/oleaut32/typelib.c	16 Oct 2003 19:09:41 -0000	1.102
+++ dlls/oleaut32/typelib.c	2 Nov 2003 17:00:47 -0000
@@ -4335,6 +4335,7 @@
 ) {
     UINT arglen = _argsize(vt)*sizeof(DWORD);
     VARTYPE	oldvt;
+    VARIANT	va;
 
     if ((vt==VT_PTR) && tdesc && (tdesc->u.lptdesc->vt == VT_VARIANT)) {
 	memcpy(argpos,&arg,sizeof(void*));
@@ -4345,7 +4346,12 @@
 	memcpy(argpos, &V_UNION(arg,lVal), arglen);
 	return S_OK;
     }
-    
+
+    if (V_ISARRAY(arg) && (vt == VT_SAFEARRAY)) {
+	memcpy(argpos, &V_UNION(arg,parray), sizeof(SAFEARRAY*));
+	return S_OK;
+    }
+
     if (vt == VT_VARIANT) {
 	memcpy(argpos, arg, arglen);
 	return S_OK;
@@ -4362,6 +4368,7 @@
     }
     if ((vt == VT_PTR) && tdesc)
 	return _copy_arg(tinfo, tdesc->u.lptdesc, argpos, arg, tdesc->u.lptdesc->vt);
+
     if ((vt == VT_USERDEFINED) && tdesc && tinfo) {
 	ITypeInfo	*tinfo2;
 	TYPEATTR	*tattr;
@@ -4432,10 +4439,14 @@
 	}
 	return E_FAIL;
     }
+
     oldvt = V_VT(arg);
-    if (VariantChangeType(arg,arg,0,vt)==S_OK) {
-    	FIXME("argument was coerced in-place (0x%x -> 0x%x); source data has been modified!!!\n", oldvt, vt);
-	memcpy(argpos,&V_UNION(arg,lVal), arglen);
+    VariantInit(&va);
+    if (VariantChangeType(&va,arg,0,vt)==S_OK) {
+	memcpy(argpos,&V_UNION(&va,lVal), arglen);
+	FIXME("Should not use VariantChangeType here. (conversion from 0x%x -> 0x%x)\n",
+		V_VT(arg), vt
+	);
 	return S_OK;
     }
     ERR("Set arg to disparg type 0x%x vs 0x%x\n",V_VT(arg),vt);



More information about the wine-patches mailing list