Piotr Caban : oleaut32: Add support for VARIANT arguments with default value in AddFuncDesc.

Alexandre Julliard julliard at winehq.org
Tue Apr 9 13:41:29 CDT 2013


Module: wine
Branch: master
Commit: fc456a3fea0f2d907490755e32b2c65d29908bd5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fc456a3fea0f2d907490755e32b2c65d29908bd5

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Apr  9 12:12:51 2013 +0200

oleaut32: Add support for VARIANT arguments with default value in AddFuncDesc.

---

 dlls/oleaut32/tests/typelib.c |   48 +++++++++++++++++++++++++++++++++++++++-
 dlls/oleaut32/typelib2.c      |   12 +++++++++-
 2 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index ca414867..33d1139 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -2084,6 +2084,49 @@ static void test_CreateTypeLib(void) {
 
     ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
 
+    elemdesc[0].tdesc.vt = VT_VARIANT;
+    U(elemdesc[0]).paramdesc.pparamdescex = ¶mdescex;
+    U(elemdesc[0]).paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
+    V_VT(&paramdescex.varDefaultValue) = VT_INT;
+    V_INT(&paramdescex.varDefaultValue) = 3;
+
+    funcdesc.lprgelemdescParam = elemdesc;
+    funcdesc.invkind = INVOKE_FUNC;
+    funcdesc.cParams = 1;
+    funcdesc.elemdescFunc.tdesc.vt = VT_VARIANT;
+
+    hres = ICreateTypeInfo_AddFuncDesc(createti, 6, &funcdesc);
+    ok(hres == S_OK, "got %08x\n", hres);
+
+    hres = ITypeInfo2_GetFuncDesc(ti2, 6, &pfuncdesc);
+    ok(hres == S_OK, "got %08x\n", hres);
+
+    ok(pfuncdesc->memid == 0x60010006, "got %x\n", pfuncdesc->memid);
+    ok(pfuncdesc->lprgscode == NULL, "got %p\n", pfuncdesc->lprgscode);
+    ok(pfuncdesc->lprgelemdescParam != NULL, "got %p\n", pfuncdesc->lprgelemdescParam);
+    ok(pfuncdesc->funckind == FUNC_PUREVIRTUAL, "got 0x%x\n", pfuncdesc->funckind);
+    ok(pfuncdesc->invkind == INVOKE_FUNC, "got 0x%x\n", pfuncdesc->invkind);
+    ok(pfuncdesc->callconv == CC_STDCALL, "got 0x%x\n", pfuncdesc->callconv);
+    ok(pfuncdesc->cParams == 1, "got %d\n", pfuncdesc->cParams);
+    ok(pfuncdesc->cParamsOpt == 0, "got %d\n", pfuncdesc->cParamsOpt);
+    ok(pfuncdesc->oVft == 36 || broken(pfuncdesc->oVft == 48), /* xp64 */
+            "got %d\n", pfuncdesc->oVft);
+    ok(pfuncdesc->cScodes == 0, "got %d\n", pfuncdesc->cScodes);
+    ok(pfuncdesc->elemdescFunc.tdesc.vt == VT_VARIANT, "got %d\n", pfuncdesc->elemdescFunc.tdesc.vt);
+    ok(pfuncdesc->wFuncFlags == 0, "got 0x%x\n", pfuncdesc->wFuncFlags);
+
+    edesc = pfuncdesc->lprgelemdescParam;
+    ok(U(*edesc).paramdesc.pparamdescex != NULL, "got: %p\n", U(*edesc).paramdesc.pparamdescex);
+    ok(U(*edesc).paramdesc.wParamFlags == PARAMFLAG_FHASDEFAULT,
+            "got: 0x%x\n", U(*edesc).paramdesc.wParamFlags);
+    ok(edesc->tdesc.vt == VT_VARIANT, "got: %d\n", edesc->tdesc.vt);
+    ok(V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue) == VT_INT, "got: %d\n",
+            V_VT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue));
+    ok(V_INT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue) == 3, "got: %d\n",
+            V_INT(&U(*edesc).paramdesc.pparamdescex->varDefaultValue));
+
+    ITypeInfo2_ReleaseFuncDesc(ti2, pfuncdesc);
+
     hres = ITypeInfo_GetDocumentation(interface1, 0, &name, &docstring, &helpcontext, &helpfile);
     ok(hres == S_OK, "got %08x\n", hres);
     ok(name == NULL, "name != NULL\n");
@@ -2164,6 +2207,7 @@ static void test_CreateTypeLib(void) {
     hres = ITypeInfo_GetImplTypeFlags(interface2, 1, &impltypeflags);
     ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
 
+    funcdesc.elemdescFunc.tdesc.vt = VT_VOID;
     funcdesc.oVft = 0xaaac;
     hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
     ok(hres == S_OK, "got %08x\n", hres);
@@ -2416,10 +2460,10 @@ static void test_CreateTypeLib(void) {
     ok(hres == S_OK, "got %08x\n", hres);
     ok(typeattr->cbSizeInstance == 4, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
     ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind);
-    ok(typeattr->cFuncs == 12, "cFuncs = %d\n", typeattr->cFuncs);
+    ok(typeattr->cFuncs == 13, "cFuncs = %d\n", typeattr->cFuncs);
     ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
     ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
-    ok(typeattr->cbSizeVft == 60 || broken(typeattr->cbSizeVft == 3 * sizeof(void *) + 48), /* xp64 */
+    ok(typeattr->cbSizeVft == 64 || broken(typeattr->cbSizeVft == 3 * sizeof(void *) + 52), /* xp64 */
        "cbSizeVft = %d\n", typeattr->cbSizeVft);
     ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
     ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index f3d742d..7d5b1c8 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -886,7 +886,9 @@ static HRESULT ctl2_encode_variant(
         arg_type = VT_UI4;
 
     v = *value;
-    if(V_VT(value) != arg_type) {
+    if(arg_type == VT_VARIANT) {
+        arg_type = V_VT(value);
+    }else if(V_VT(value) != arg_type) {
         hres = VariantChangeType(&v, value, 0, arg_type);
         if(FAILED(hres))
             return hres;
@@ -894,6 +896,8 @@ static HRESULT ctl2_encode_variant(
 
     /* Check if default value can be stored in encoded_value */
     switch(arg_type) {
+    case VT_INT:
+    case VT_UINT:
     case VT_I4:
     case VT_UI4:
         mask = 0x3ffffff;
@@ -1223,6 +1227,12 @@ static int ctl2_encode_typedesc(
 	*alignment = 4; /* guess? */
 	break;
 
+    case VT_VARIANT:
+        *encoded_tdesc = default_tdesc;
+        *width = sizeof(VT_VARIANT);
+        *alignment = 4;
+        break;
+
     case VT_VOID:
 	*encoded_tdesc = 0x80000000 | (VT_EMPTY << 16) | tdesc->vt;
 	*width = 0;




More information about the wine-cvs mailing list