typelib patch

Ove Kaaven ovek at arcticnet.no
Sat Oct 13 12:29:23 CDT 2001


Log:
Ove Kaaven <ovek at transgaming.com>
Fixed bugs with propget methods with input arguments.
Improved variant debug dumps.

Index: dlls/oleaut32/typelib.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/typelib.c,v
retrieving revision 1.54
diff -u -r1.54 typelib.c
--- dlls/oleaut32/typelib.c	2001/10/10 02:51:24	1.54
+++ dlls/oleaut32/typelib.c	2001/10/13 15:46:06
@@ -759,7 +763,15 @@
     /* FIXME : we could have better trace here, depending on the VARTYPE
      * of the variant
      */
-    switch(vt) {
+    if (vt & VT_RESERVED)
+	szVarType += strlen(strcpy(szVarType, "reserved | "));
+    if (vt & VT_BYREF)
+	szVarType += strlen(strcpy(szVarType, "ref to "));
+    if (vt & VT_ARRAY)
+	szVarType += strlen(strcpy(szVarType, "array of "));
+    if (vt & VT_VECTOR)
+	szVarType += strlen(strcpy(szVarType, "vector of "));
+    switch(vt & VT_TYPEMASK) {
     case VT_UI1: sprintf(szVarType, "VT_UI"); break;
     case VT_I2: sprintf(szVarType, "VT_I2"); break;
     case VT_I4: sprintf(szVarType, "VT_I4"); break;
@@ -770,21 +782,30 @@
     case VT_CY: sprintf(szVarType, "VT_CY"); break;
     case VT_DATE: sprintf(szVarType, "VT_DATE"); break;
     case VT_BSTR: sprintf(szVarType, "VT_BSTR"); break;
-    case VT_BYREF: case VT_UNKNOWN: sprintf(szVarType, "VT_BYREF"); break;
+    case VT_UNKNOWN: sprintf(szVarType, "VT_UNKNOWN"); break;
     case VT_DISPATCH: sprintf(szVarType, "VT_DISPATCH"); break;
-    case VT_ARRAY: sprintf(szVarType, "VT_ARRAY"); break;
     case VT_I1: sprintf(szVarType, "VT_I1"); break;
     case VT_UI2: sprintf(szVarType, "VT_UI2"); break;
     case VT_UI4: sprintf(szVarType, "VT_UI4"); break;
     case VT_INT: sprintf(szVarType, "VT_INT"); break;
     case VT_UINT: sprintf(szVarType, "VT_UINT"); break;
+    case VT_VARIANT: sprintf(szVarType, "VT_VARIANT"); break;
+    case VT_VOID: sprintf(szVarType, "VT_VOID"); break;
     case VT_USERDEFINED: sprintf(szVarType, "VT_USERDEFINED\n"); break;
-    default: sprintf(szVarType, "unknown");break;
+    default: sprintf(szVarType, "unknown(%d)", vt & VT_TYPEMASK); break;
     }
 }
 
 static void dump_TypeDesc(TYPEDESC *pTD,char *szVarType) {
-    switch(pTD->vt) {
+    if (pTD->vt & VT_RESERVED)
+	szVarType += strlen(strcpy(szVarType, "reserved | "));
+    if (pTD->vt & VT_BYREF)
+	szVarType += strlen(strcpy(szVarType, "ref to "));
+    if (pTD->vt & VT_ARRAY)
+	szVarType += strlen(strcpy(szVarType, "array of "));
+    if (pTD->vt & VT_VECTOR)
+	szVarType += strlen(strcpy(szVarType, "vector of "));
+    switch(pTD->vt & VT_TYPEMASK) {
     case VT_UI1: sprintf(szVarType, "VT_UI1"); break;
     case VT_I2: sprintf(szVarType, "VT_I2"); break;
     case VT_I4: sprintf(szVarType, "VT_I4"); break;
@@ -795,9 +816,8 @@
     case VT_CY: sprintf(szVarType, "VT_CY"); break;
     case VT_DATE: sprintf(szVarType, "VT_DATE"); break;
     case VT_BSTR: sprintf(szVarType, "VT_BSTR"); break;
-    case VT_BYREF: case VT_UNKNOWN: sprintf(szVarType, "VT_BYREF"); break;
+    case VT_UNKNOWN: sprintf(szVarType, "VT_UNKNOWN"); break;
     case VT_DISPATCH: sprintf(szVarType, "VT_DISPATCH"); break;
-    case VT_ARRAY: sprintf(szVarType, "VT_ARRAY"); break;
     case VT_I1: sprintf(szVarType, "VT_I1"); break;
     case VT_UI2: sprintf(szVarType, "VT_UI2"); break;
     case VT_UI4: sprintf(szVarType, "VT_UI4"); break;
@@ -818,7 +838,7 @@
       dump_TypeDesc(&pTD->u.lpadesc->tdescElem, szVarType + strlen(szVarType));
       break;
 
-    default: sprintf(szVarType, "unknown");break;
+    default: sprintf(szVarType, "unknown(%d)", pTD->vt & VT_TYPEMASK); break;
     }
 }
 
@@ -935,7 +955,8 @@
       
 static void dump_Variant(VARIANT * pvar)
 {
-    char szVarType[15];
+    char szVarType[32];
+    LPVOID ref;
     
     TRACE("(%p)\n", pvar);
  
@@ -949,24 +970,61 @@
     dump_VarType(V_VT(pvar),szVarType);
 
     TRACE("VARTYPE: %s\n", szVarType);
-    
+
+    if (V_VT(pvar) & VT_BYREF) {
+      ref = V_UNION(pvar, byref);
+      TRACE("%p\n", ref);
+    }
+    else ref = &V_UNION(pvar, cVal);
+
+    if (V_VT(pvar) & VT_ARRAY) {
+      /* FIXME */
+      return;
+    }
+    if (V_VT(pvar) & VT_VECTOR) {
+      /* FIXME */
+      return;
+    }
+
     switch (V_VT(pvar))
     {
+        case VT_I2:
+            TRACE("%d\n", *(short*)ref);
+            break;
+
+        case VT_I4:
+            TRACE("%d\n", *(INT*)ref);
+            break;
+
         case VT_R4:
-            TRACE("%3.3e\n", V_UNION(pvar, fltVal));
+            TRACE("%3.3e\n", *(float*)ref);
             break;
-            
+
         case VT_R8:
-            TRACE("%3.3e\n", V_UNION(pvar, dblVal));
+            TRACE("%3.3e\n", *(double*)ref);
             break;
-            
+
+        case VT_BOOL:
+            TRACE("%s\n", *(VARIANT_BOOL*)ref ? "TRUE" : "FALSE");
+            break;
+
+        case VT_BSTR:
+            TRACE("%s\n", debugstr_w(*(BSTR*)ref));
+            break;
+
+        case VT_UNKNOWN:
+        case VT_DISPATCH:
+            TRACE("%p\n", *(LPVOID*)ref);
+            break;
+
+        case VT_VARIANT:
+            if (V_VT(pvar) & VT_BYREF) dump_Variant(ref);
+            break;
+
         default:
-            TRACE("%ld\n", V_UNION(pvar, lVal));
+            TRACE("(?)%ld\n", *(long*)ref);
             break;
     }       
-
-    if (V_VT(pvar) & VT_BYREF)
-      return dump_Variant(V_UNION(pvar,pvarVal));
 }
 
 static void dump_DispParms(DISPPARAMS * pdp)
@@ -3961,13 +4030,13 @@
 	    );
 	    if (pVarResult && (dwFlags & (DISPATCH_PROPERTYGET))) {
 		for (i=0;i<pFDesc->funcdesc.cParams-pDispParams->cArgs;i++) {
-		    TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc);
+		    TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i+pDispParams->cArgs].tdesc);
 		    /* If we are a pointer to a variant, we are done already */
 		    if ((tdesc->vt==VT_PTR)&&(tdesc->u.lptdesc->vt==VT_VARIANT))
 			continue;
 
 		    VariantInit(&pVarResult[i]);
-		    V_UNION(pVarResult+i,intVal) = args2[i];
+		    V_UNION(pVarResult+i,intVal) = args2[i+pDispParams->cArgs];
 
 		    if (tdesc->vt == VT_PTR)
 			tdesc = tdesc->u.lptdesc;
@@ -3980,9 +4049,8 @@
 		     */
 		    if ((tdesc->vt == VT_PTR) && (dwFlags & DISPATCH_METHOD))
 			V_VT(pVarResult+i) = VT_DISPATCH;
-		    TRACE("storing into variant: [%d] type %d, val %08x\n",
-			    i,V_VT(pVarResult+i),V_UNION(pVarResult+i,intVal)
-		    );
+		    TRACE("storing into variant: [%d]\n", i);
+		    dump_Variant(pVarResult+i);
 		}
 	    }
 	    HeapFree(GetProcessHeap(),0,args2);





More information about the wine-patches mailing list