[PATCH v2 1/6] oleaut32/tests: Cover Get*CustData in test_dump_typelib.

Kevin Puetz PuetzKevinA at JohnDeere.com
Fri Oct 30 00:07:25 CDT 2020


Signed-off-by: Kevin Puetz <PuetzKevinA at JohnDeere.com>
---

v2 fixes an "unknown number of optional attrs" warning from widl.
I had overlooked a case 0:, where there are no extra_attrs, so the 
new code in add_var_desc does nothing (but shouldn't warn).
Another catch for our favorite paranoid android... or at least the logs
he emails out. Sorry I overlooked the warning in my own build.
---

The oleaut32 bugs fixed in 5/6 and 6/6 motivated this series:
They were discovered while processing a midl-generated typelib
with a binding generator that uses ITypeLib.

As no wine .tlb files currently have custdata, this first patch just adds
the test infrastructure to explicitly verify that, (and with it,
the noisy diffs in the autogenerated part of tests/typelib.c).

The rest of this series adds then widl support for [custom(...)],
and then data in test_tlb.idl which (using that widl support)
produces a test_tlb.tlb that exercises the bug fixes.
I have also verified (manually) that these conformance tests
pass when reading a midl-generated test_tlb.tlb.

Having widl support [custom(...)] also addresses one of the main
blockers to building our projects' typelibs with widl instead of midl,
though it isn't yet the last one...
---
 dlls/oleaut32/tests/typelib.c | 275 +++++++++++++++++++++++++++++++++-
 1 file changed, 267 insertions(+), 8 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 47a84a769e1..3c7a3bd147d 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -4315,6 +4315,12 @@ static const char *dump_variant_info(const VARIANT *v)
     return buf;
 }
 
+static const char *dump_custdata_info(LPCUSTDATAITEM item) {
+    static char buf[256];
+    sprintf(buf, "{ \"%s\", %s }", wine_dbgstr_guid(&item->guid), dump_variant_info(&item->varValue));
+    return buf;
+}
+
 static int get_href_type(ITypeInfo *info, TYPEDESC *tdesc)
 {
     int href_type = -1;
@@ -4342,10 +4348,12 @@ static int get_href_type(ITypeInfo *info, TYPEDESC *tdesc)
 static void test_dump_typelib(const WCHAR *name)
 {
     ITypeInfo *info;
+    ITypeInfo2 *info2;
     ITypeLib *lib;
     int count;
     int i;
     HREFTYPE hRefType = 0;
+    CUSTDATA cust_data;
 
     OLE_CHECK(LoadTypeLib(name, &lib));
 
@@ -4357,7 +4365,7 @@ static void test_dump_typelib(const WCHAR *name)
         TYPEATTR *attr;
         BSTR name;
         DWORD help_ctx;
-        int f = 0, v = 0;
+        int f = 0, v = 0, c = 0;
 
         OLE_CHECK(ITypeLib_GetDocumentation(lib, i, &name, NULL, &help_ctx, NULL));
         printf("{\n"
@@ -4371,7 +4379,10 @@ static void test_dump_typelib(const WCHAR *name)
             ITypeInfo_Release(info);
             info = refInfo;
         }
+        OLE_CHECK(ITypeInfo_QueryInterface(info, &IID_ITypeInfo2, (void**)&info2));
+
         OLE_CHECK(ITypeInfo_GetTypeAttr(info, &attr));
+        OLE_CHECK(ITypeInfo2_GetAllCustData(info2,&cust_data));
 
         printf("  \"%s\",\n", wine_dbgstr_guid(&attr->guid));
 
@@ -4382,6 +4393,13 @@ static void test_dump_typelib(const WCHAR *name)
             help_ctx, MAKELONG(attr->wMinorVerNum, attr->wMajorVerNum),
             attr->cbSizeVft/sizeof(void*), attr->cFuncs, attr->cVars);
 
+        printf("  /*#custdata*/ %d, %s\n", cust_data.cCustData, cust_data.cCustData ? "{" : "{},");
+        for (c = 0; c < cust_data.cCustData; ++c) {
+            printf("    %s,\n", dump_custdata_info(&cust_data.prgCustData[c]));
+        }
+        if (cust_data.cCustData) printf("  },\n");
+        ClearCustData(&cust_data);
+
         printf("  { /* funcs */%s", attr->cFuncs ? "\n" : " },\n");
         while (1)
         {
@@ -4392,6 +4410,7 @@ static void test_dump_typelib(const WCHAR *name)
 
             if (FAILED(ITypeInfo_GetFuncDesc(info, f, &desc)))
                 break;
+            OLE_CHECK(ITypeInfo2_GetAllFuncCustData(info2,f,&cust_data));
             printf("    {\n"
                    "      /*id*/ 0x%x, /*func*/ %s, /*inv*/ %s, /*call*/ %s,\n",
                 desc->memid, map_value(desc->funckind, funckind_map), map_value(desc->invkind, invkind_map),
@@ -4400,12 +4419,30 @@ static void test_dump_typelib(const WCHAR *name)
                 desc->cParams, desc->cParamsOpt, desc->oVft/sizeof(void*), desc->cScodes, dump_func_flags(desc->wFuncFlags));
             printf("      {%s, %s, %s}, /* ret */\n", map_value(desc->elemdescFunc.tdesc.vt, vt_map),
                 map_value(get_href_type(info, &desc->elemdescFunc.tdesc), tkind_map), dump_param_flags(U(desc->elemdescFunc).paramdesc.wParamFlags));
+            printf("      /*#custdata*/ %d, %s\n", cust_data.cCustData, cust_data.cCustData ? "{" : "{},");
+            for (c = 0; c < cust_data.cCustData; ++c) {
+                printf("        %s,\n", dump_custdata_info(&cust_data.prgCustData[c]));
+            }
+            if (cust_data.cCustData) printf("      },\n");
+            ClearCustData(&cust_data);
+
             printf("      { /* params */\n");
             for (p = 0; p < desc->cParams; p++)
             {
                 ELEMDESC e = desc->lprgelemdescParam[p];
-                printf("        {%s, %s, %s},\n", map_value(e.tdesc.vt, vt_map),
+                OLE_CHECK(ITypeInfo2_GetAllParamCustData(info2,f,p,&cust_data));
+                printf("        {%s, %s, %s", map_value(e.tdesc.vt, vt_map),
                     map_value(get_href_type(info, &e.tdesc), tkind_map), dump_param_flags(U(e).paramdesc.wParamFlags));
+                if (cust_data.cCustData) {
+                    printf(", /*#custdata*/ %d, {\n", cust_data.cCustData);
+                    for (c = 0; c < cust_data.cCustData; ++c) {
+                        printf("          %s,\n", dump_custdata_info(&cust_data.prgCustData[c]));
+                    }
+                    printf("        } },\n");
+                } else {
+                    printf("},\n");
+                }
+                ClearCustData(&cust_data);
             }
             printf("        {-1, 0, 0}\n");
             printf("      },\n");
@@ -4432,6 +4469,7 @@ static void test_dump_typelib(const WCHAR *name)
             UINT cNames;
             if (FAILED(ITypeInfo_GetVarDesc(info, v, &desc)))
                 break;
+            OLE_CHECK(ITypeInfo2_GetAllVarCustData(info2,v,&cust_data));
             OLE_CHECK(ITypeInfo_GetNames(info, desc->memid, &varname, 1, &cNames));
             if(cNames!=1) { printf("GetNames failed - VARDESC should have one name, got %d\n", cNames); return; }
             printf("    {\n"
@@ -4445,6 +4483,14 @@ static void test_dump_typelib(const WCHAR *name)
             } else {
                 printf("      { /* DUMMYUNIONNAME unused*/ },\n");
             }
+
+            printf("      /*#custdata*/ %d, %s\n", cust_data.cCustData, cust_data.cCustData ? "{" : "{},");
+            for (c = 0; c < cust_data.cCustData; ++c) {
+                printf("        %s,\n", dump_custdata_info(&cust_data.prgCustData[c]));
+            }
+            if (cust_data.cCustData) printf("      },\n");
+            ClearCustData(&cust_data);
+
             printf("      {%s, %s, %s}, /* ret */\n", map_value(desc->elemdescVar.tdesc.vt, vt_map),
                 map_value(get_href_type(info, &desc->elemdescVar.tdesc), tkind_map), dump_param_flags(U(desc->elemdescVar).paramdesc.wParamFlags));
             printf("    },\n");
@@ -4467,6 +4513,7 @@ static void test_dump_typelib(const WCHAR *name)
         }
 
         ITypeInfo_ReleaseTypeAttr(info, attr);
+        ITypeInfo2_Release(info2);
         ITypeInfo_Release(info);
         SysFreeString(name);
     }
@@ -4485,11 +4532,18 @@ typedef struct _variant_info {
     };
 } variant_info;
 
+typedef struct _custdata_info {
+    LPCSTR uuid;
+    variant_info value;
+} custdata_info;
+
 typedef struct _element_info
 {
     VARTYPE vt;
     TYPEKIND type;
     USHORT wParamFlags;
+    DWORD cCustData;
+    custdata_info custdata[5];
 } element_info;
 
 typedef struct _function_info
@@ -4504,6 +4558,8 @@ typedef struct _function_info
     short cScodes;
     WORD wFuncFlags;
     element_info ret_type;
+    DWORD cCustData;
+    custdata_info custdata[5];
     element_info params[15];
     LPCSTR names[15];
 } function_info;
@@ -4518,6 +4574,8 @@ typedef struct _var_info
         ULONG oInst; /* VAR_PERINSTANCE */
         variant_info varValue; /* VAR_CONST */
     } DUMMYUNIONNAME;
+    DWORD cCustData;
+    custdata_info custdata[5];
     element_info elemdescVar;
 } var_info;
 
@@ -4534,6 +4592,8 @@ typedef struct _type_info
     USHORT cbSizeVft;
     USHORT cFuncs;
     USHORT cVars;
+    DWORD cCustData;
+    custdata_info custdata[5];
     function_info funcs[20];
     var_info vars[20];
 } type_info;
@@ -4546,11 +4606,13 @@ static const type_info info[] = {
   "{b14b6bb5-904e-4ff9-b247-bd361f7a0001}",
   /*kind*/ TKIND_RECORD, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(struct g), /*size*/ sizeof(struct g),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 1,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "g1", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -4560,11 +4622,13 @@ static const type_info info[] = {
   "{b14b6bb5-904e-4ff9-b247-bd361f7a0002}",
   /*kind*/ TKIND_INTERFACE, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(test_iface*), /*size*/ sizeof(test_iface*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 4, /*#func*/ 1, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60010000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 3, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FIN},
         {-1, 0, 0}
@@ -4583,11 +4647,13 @@ static const type_info info[] = {
   "{b14b6bb5-904e-4ff9-b247-bd361f7aa001}",
   /*kind*/ TKIND_INTERFACE, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(parent_iface*), /*size*/ sizeof(parent_iface*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 4, /*#func*/ 1, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60010000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 3, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT|PARAMFLAG_FRETVAL},
         {-1, 0, 0}
@@ -4606,11 +4672,13 @@ static const type_info info[] = {
   "{b14b6bb5-904e-4ff9-b247-bd361f7aa002}",
   /*kind*/ TKIND_INTERFACE, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(child_iface*), /*size*/ sizeof(child_iface*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 5, /*#func*/ 1, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60020000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 4, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -4627,11 +4695,13 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a753903}",
   /*kind*/ TKIND_RECORD, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(struct _n), /*size*/ sizeof(struct _n),
   /*helpctx*/ 0x0003, /*version*/ 0x00010002, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 1,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "n1", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -4641,6 +4711,7 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a753902}",
   /*kind*/ TKIND_ALIAS, /*flags*/ TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(n), /*size*/ sizeof(n),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -4649,6 +4720,7 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ALIAS, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(nn), /*size*/ sizeof(nn),
   /*helpctx*/ 0x0003, /*version*/ 0x00010002, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -4657,11 +4729,13 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a753906}",
   /*kind*/ TKIND_RECORD, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(struct _m), /*size*/ sizeof(struct _m),
   /*helpctx*/ 0x0003, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 1,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "m1", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -4671,6 +4745,7 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a753905}",
   /*kind*/ TKIND_ALIAS, /*flags*/ TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(m), /*size*/ sizeof(m),
   /*helpctx*/ 0x0000, /*version*/ 0x00010002, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -4679,6 +4754,7 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ALIAS, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(mm), /*size*/ sizeof(mm),
   /*helpctx*/ 0x0003, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -4687,11 +4763,13 @@ static const type_info info[] = {
   "{b14b6bb5-904e-4ff9-b247-bd361f7aaedd}",
   /*kind*/ TKIND_DISPATCH, /*flags*/ TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL, /*align*/ TYPE_ALIGNMENT(IDualIface*), /*size*/ sizeof(IDualIface*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 7, /*#func*/ 8, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60000000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 2, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FOUT},
@@ -4708,6 +4786,7 @@ static const type_info info[] = {
       /*id*/ 0x60000001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 1, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_UI4, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -4720,6 +4799,7 @@ static const type_info info[] = {
       /*id*/ 0x60000002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 2, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_UI4, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -4732,6 +4812,7 @@ static const type_info info[] = {
       /*id*/ 0x60010000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 3, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT},
         {-1, 0, 0}
@@ -4746,6 +4827,7 @@ static const type_info info[] = {
       /*id*/ 0x60010001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 3, /*#opt*/ 0, /*vtbl*/ 4, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_UINT, -1, PARAMFLAG_FIN},
         {VT_UI4, -1, PARAMFLAG_FIN},
@@ -4764,6 +4846,7 @@ static const type_info info[] = {
       /*id*/ 0x60010002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 5, /*#opt*/ 0, /*vtbl*/ 5, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FIN},
@@ -4786,6 +4869,7 @@ static const type_info info[] = {
       /*id*/ 0x60010003, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 8, /*#opt*/ 0, /*vtbl*/ 6, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_I4, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FIN},
@@ -4814,6 +4898,7 @@ static const type_info info[] = {
       /*id*/ 0x60020000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -4830,11 +4915,13 @@ static const type_info info[] = {
   "{b14b6bb5-904e-4ff9-b247-bd361f7aaedd}",
   /*kind*/ TKIND_INTERFACE, /*flags*/ TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FOLEAUTOMATION|TYPEFLAG_FDUAL, /*align*/ TYPE_ALIGNMENT(IDualIface*), /*size*/ sizeof(IDualIface*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 8, /*#func*/ 1, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60020000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -4851,11 +4938,13 @@ static const type_info info[] = {
   "{ec5dfcd6-eeb0-4cd6-b51e-8030e1dac009}",
   /*kind*/ TKIND_INTERFACE, /*flags*/ TYPEFLAG_FDISPATCHABLE, /*align*/ TYPE_ALIGNMENT(ISimpleIface*), /*size*/ sizeof(ISimpleIface*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 8, /*#func*/ 1, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60020000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -4872,26 +4961,31 @@ static const type_info info[] = {
   "{4029f190-ca4a-4611-aeb9-673983cb96dd}",
   /*kind*/ TKIND_RECORD, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(struct test_struct), /*size*/ sizeof(struct test_struct),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 4,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "hr", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "b", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 4 },
+      /*#custdata*/ 0, {},
       {VT_BOOL, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000002, /*name*/ "disp", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 8 },
+      /*#custdata*/ 0, {},
       {VT_DISPATCH, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000003, /*name*/ "bstr", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 12 },
+      /*#custdata*/ 0, {},
       {VT_BSTR, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -4901,26 +4995,31 @@ static const type_info info[] = {
   "{4029f190-ca4a-4611-aeb9-673983cb96de}",
   /*kind*/ TKIND_RECORD, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(struct test_struct2), /*size*/ sizeof(struct test_struct2),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 4,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "hr", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "b", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 4 },
+      /*#custdata*/ 0, {},
       {VT_BOOL, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000002, /*name*/ "disp", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 8 },
+      /*#custdata*/ 0, {},
       {VT_DISPATCH, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000003, /*name*/ "bstr", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 12 },
+      /*#custdata*/ 0, {},
       {VT_BSTR, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -4930,6 +5029,7 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a75396a}",
   /*kind*/ TKIND_ALIAS, /*flags*/ TYPEFLAG_FRESTRICTED, /*align*/ TYPE_ALIGNMENT(t_INT), /*size*/ sizeof(t_INT),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -4938,6 +5038,7 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ALIAS, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(a), /*size*/ sizeof(a),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -4946,16 +5047,19 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ENUM, /*flags*/ 0, /*align*/ 4, /*size*/ 4,
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "a1", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 0 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "a2", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 1 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -4965,16 +5069,19 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ENUM, /*flags*/ 0, /*align*/ 4, /*size*/ 4,
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "aa1", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 0 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "aa2", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 1 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -4984,16 +5091,19 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ENUM, /*flags*/ 0, /*align*/ 4, /*size*/ 4,
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "b1", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 0 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "b2", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 1 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5003,16 +5113,19 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ENUM, /*flags*/ 0, /*align*/ 4, /*size*/ 4,
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "bb1", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 0 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "bb2", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 1 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5022,6 +5135,7 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a75396b}",
   /*kind*/ TKIND_ALIAS, /*flags*/ 0, /*align*/ TYPE_ALIGNMENT(c), /*size*/ sizeof(c),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -5030,16 +5144,19 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ENUM, /*flags*/ 0, /*align*/ 4, /*size*/ 4,
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "c1", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 0 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "c2", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 1 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5049,16 +5166,19 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a75396c}",
   /*kind*/ TKIND_ENUM, /*flags*/ 0, /*align*/ 4, /*size*/ 4,
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "cc1", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 0 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "cc2", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 1 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5068,6 +5188,7 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a75396d}",
   /*kind*/ TKIND_ALIAS, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(d), /*size*/ sizeof(d),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -5076,16 +5197,19 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_ENUM, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ 4, /*size*/ 4,
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "d1", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 0 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "d2", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 1 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5095,16 +5219,19 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a75396e}",
   /*kind*/ TKIND_ENUM, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ 4, /*size*/ 4,
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "dd1", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 0 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "dd2", /*flags*/ 0, /*kind*/ VAR_CONST,
       { .varValue = { VT_I4, { .value_int = 1 } } },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5114,6 +5241,7 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a753970}",
   /*kind*/ TKIND_ALIAS, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(e), /*size*/ sizeof(e),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -5122,11 +5250,13 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_RECORD, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(struct _e), /*size*/ sizeof(struct _e),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 1,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "e1", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5136,11 +5266,13 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a753971}",
   /*kind*/ TKIND_RECORD, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(struct ee), /*size*/ sizeof(struct ee),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 1,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "ee1", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5150,6 +5282,7 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a753972}",
   /*kind*/ TKIND_ALIAS, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(f), /*size*/ sizeof(f),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */ },
 },
@@ -5158,16 +5291,19 @@ static const type_info info[] = {
   "{00000000-0000-0000-0000-000000000000}",
   /*kind*/ TKIND_UNION, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(union _f), /*size*/ sizeof(union _f),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "f1", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "f2", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_PTR, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5177,16 +5313,19 @@ static const type_info info[] = {
   "{016fe2ec-b2c8-45f8-b23b-39e53a753973}",
   /*kind*/ TKIND_UNION, /*flags*/ TYPEFLAG_FRESTRICTED|TYPEFLAG_FHIDDEN, /*align*/ TYPE_ALIGNMENT(union ff), /*size*/ sizeof(union ff),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 0, /*#func*/ 0, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */ },
   { /* vars */
     {
       /*id*/ 0x40000000, /*name*/ "ff1", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0x40000001, /*name*/ "ff2", /*flags*/ 0, /*kind*/ VAR_PERINSTANCE,
       { .oInst = 0 },
+      /*#custdata*/ 0, {},
       {VT_PTR, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5196,11 +5335,13 @@ static const type_info info[] = {
   "{ec5dfcd6-eeb0-4cd6-b51e-8030e1dac00a}",
   /*kind*/ TKIND_INTERFACE, /*flags*/ TYPEFLAG_FDISPATCHABLE, /*align*/ TYPE_ALIGNMENT(ITestIface*), /*size*/ sizeof(ITestIface*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 13, /*#func*/ 6, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60020000, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_USERDEFINED, TKIND_ALIAS, PARAMFLAG_NONE},
         {-1, 0, 0}
@@ -5215,6 +5356,7 @@ static const type_info info[] = {
       /*id*/ 0x60020001, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 8, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_USERDEFINED, TKIND_ENUM, PARAMFLAG_NONE},
         {-1, 0, 0}
@@ -5229,6 +5371,7 @@ static const type_info info[] = {
       /*id*/ 0x60020002, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 9, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_USERDEFINED, TKIND_ALIAS, PARAMFLAG_NONE},
         {-1, 0, 0}
@@ -5243,6 +5386,7 @@ static const type_info info[] = {
       /*id*/ 0x60020003, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 10, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_USERDEFINED, TKIND_ALIAS, PARAMFLAG_NONE},
         {-1, 0, 0}
@@ -5257,6 +5401,7 @@ static const type_info info[] = {
       /*id*/ 0x60020004, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 11, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_USERDEFINED, TKIND_ALIAS, PARAMFLAG_NONE},
         {-1, 0, 0}
@@ -5271,6 +5416,7 @@ static const type_info info[] = {
       /*id*/ 0x60020005, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 12, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_USERDEFINED, TKIND_ALIAS, PARAMFLAG_NONE},
         {-1, 0, 0}
@@ -5289,11 +5435,13 @@ static const type_info info[] = {
   "{2d4430d5-99ea-4645-85f0-c5814b72804b}",
   /*kind*/ TKIND_DISPATCH, /*flags*/ TYPEFLAG_FDISPATCHABLE, /*align*/ TYPE_ALIGNMENT(ITestDispatch*), /*size*/ sizeof(ITestDispatch*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 7, /*#func*/ 7, /*#var*/ 2,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x1, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5306,6 +5454,7 @@ static const type_info info[] = {
       /*id*/ 0x2, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT|PARAMFLAG_FRETVAL},
         {-1, 0, 0}
@@ -5320,6 +5469,7 @@ static const type_info info[] = {
       /*id*/ 0x3, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5332,6 +5482,7 @@ static const type_info info[] = {
       /*id*/ 0x4, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT|PARAMFLAG_FRETVAL},
         {-1, 0, 0}
@@ -5346,6 +5497,7 @@ static const type_info info[] = {
       /*id*/ 0x5, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ 0,
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5358,6 +5510,7 @@ static const type_info info[] = {
       /*id*/ 0x6, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ 0,
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT|PARAMFLAG_FRETVAL},
         {-1, 0, 0}
@@ -5372,6 +5525,7 @@ static const type_info info[] = {
       /*id*/ 0x7, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 2, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_BSTR, -1, PARAMFLAG_FIN},
         {VT_I4, -1, PARAMFLAG_FLCID},
@@ -5389,11 +5543,13 @@ static const type_info info[] = {
     {
       /*id*/ 0xa, /*name*/ "property_int", /*flags*/ 0, /*kind*/ VAR_DISPATCH,
       { /* DUMMYUNIONNAME unused*/ },
+      /*#custdata*/ 0, {},
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
     },
     {
       /*id*/ 0xb, /*name*/ "property_HRESULT", /*flags*/ 0, /*kind*/ VAR_DISPATCH,
       { /* DUMMYUNIONNAME unused*/ },
+      /*#custdata*/ 0, {},
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
     },
   },
@@ -5403,11 +5559,13 @@ static const type_info info[] = {
   "{79ca07f9-ac22-44ac-9aaf-811f45412293}",
   /*kind*/ TKIND_DISPATCH, /*flags*/ TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL, /*align*/ TYPE_ALIGNMENT(ITestDispDual*), /*size*/ sizeof(ITestDispDual*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 7, /*#func*/ 14, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60000000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 2, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FOUT},
@@ -5424,6 +5582,7 @@ static const type_info info[] = {
       /*id*/ 0x60000001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 1, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_UI4, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5436,6 +5595,7 @@ static const type_info info[] = {
       /*id*/ 0x60000002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 2, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_UI4, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5448,6 +5608,7 @@ static const type_info info[] = {
       /*id*/ 0x60010000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 3, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT},
         {-1, 0, 0}
@@ -5462,6 +5623,7 @@ static const type_info info[] = {
       /*id*/ 0x60010001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 3, /*#opt*/ 0, /*vtbl*/ 4, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_UINT, -1, PARAMFLAG_FIN},
         {VT_UI4, -1, PARAMFLAG_FIN},
@@ -5480,6 +5642,7 @@ static const type_info info[] = {
       /*id*/ 0x60010002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 5, /*#opt*/ 0, /*vtbl*/ 5, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FIN},
@@ -5502,6 +5665,7 @@ static const type_info info[] = {
       /*id*/ 0x60010003, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 8, /*#opt*/ 0, /*vtbl*/ 6, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_I4, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FIN},
@@ -5530,6 +5694,7 @@ static const type_info info[] = {
       /*id*/ 0x1, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5542,6 +5707,7 @@ static const type_info info[] = {
       /*id*/ 0x2, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 8, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5554,6 +5720,7 @@ static const type_info info[] = {
       /*id*/ 0x3, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 9, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5566,6 +5733,7 @@ static const type_info info[] = {
       /*id*/ 0x4, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 10, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5578,6 +5746,7 @@ static const type_info info[] = {
       /*id*/ 0x5, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 11, /*#scodes*/ 0, /*flags*/ 0,
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5590,6 +5759,7 @@ static const type_info info[] = {
       /*id*/ 0x6, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 12, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5602,6 +5772,7 @@ static const type_info info[] = {
       /*id*/ 0x7, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 13, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_BSTR, -1, PARAMFLAG_FIN},
         {-1, 0, 0}
@@ -5620,11 +5791,13 @@ static const type_info info[] = {
   "{79ca07f9-ac22-44ac-9aaf-811f45412293}",
   /*kind*/ TKIND_INTERFACE, /*flags*/ TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FOLEAUTOMATION|TYPEFLAG_FDUAL, /*align*/ TYPE_ALIGNMENT(ITestDispDual*), /*size*/ sizeof(ITestDispDual*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 14, /*#func*/ 7, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x1, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5637,6 +5810,7 @@ static const type_info info[] = {
       /*id*/ 0x2, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 8, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT|PARAMFLAG_FRETVAL},
         {-1, 0, 0}
@@ -5651,6 +5825,7 @@ static const type_info info[] = {
       /*id*/ 0x3, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 9, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5663,6 +5838,7 @@ static const type_info info[] = {
       /*id*/ 0x4, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 10, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT|PARAMFLAG_FRETVAL},
         {-1, 0, 0}
@@ -5677,6 +5853,7 @@ static const type_info info[] = {
       /*id*/ 0x5, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 11, /*#scodes*/ 0, /*flags*/ 0,
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5689,6 +5866,7 @@ static const type_info info[] = {
       /*id*/ 0x6, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 12, /*#scodes*/ 0, /*flags*/ 0,
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT|PARAMFLAG_FRETVAL},
         {-1, 0, 0}
@@ -5703,6 +5881,7 @@ static const type_info info[] = {
       /*id*/ 0x7, /*func*/ FUNC_PUREVIRTUAL, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 3, /*#opt*/ 0, /*vtbl*/ 13, /*#scodes*/ 0, /*flags*/ 0,
       {VT_HRESULT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_BSTR, -1, PARAMFLAG_FIN},
         {VT_I4, -1, PARAMFLAG_FLCID},
@@ -5725,11 +5904,13 @@ static const type_info info[] = {
   "{cdb105e3-24fb-4ae6-b826-801b7b2a0a07}",
   /*kind*/ TKIND_DISPATCH, /*flags*/ TYPEFLAG_FDISPATCHABLE, /*align*/ TYPE_ALIGNMENT(ITestDispInherit*), /*size*/ sizeof(ITestDispInherit*),
   /*helpctx*/ 0x0000, /*version*/ 0x00000000, /*#vtbl*/ 7, /*#func*/ 14, /*#var*/ 0,
+  /*#custdata*/ 0, {},
   { /* funcs */
     {
       /*id*/ 0x60000000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 2, /*#opt*/ 0, /*vtbl*/ 0, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FOUT},
@@ -5746,6 +5927,7 @@ static const type_info info[] = {
       /*id*/ 0x60000001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 1, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_UI4, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5758,6 +5940,7 @@ static const type_info info[] = {
       /*id*/ 0x60000002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 2, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_UI4, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5770,6 +5953,7 @@ static const type_info info[] = {
       /*id*/ 0x60010000, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 3, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FOUT},
         {-1, 0, 0}
@@ -5784,6 +5968,7 @@ static const type_info info[] = {
       /*id*/ 0x60010001, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 3, /*#opt*/ 0, /*vtbl*/ 4, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_UINT, -1, PARAMFLAG_FIN},
         {VT_UI4, -1, PARAMFLAG_FIN},
@@ -5802,6 +5987,7 @@ static const type_info info[] = {
       /*id*/ 0x60010002, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 5, /*#opt*/ 0, /*vtbl*/ 5, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_PTR, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FIN},
@@ -5824,6 +6010,7 @@ static const type_info info[] = {
       /*id*/ 0x60010003, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 8, /*#opt*/ 0, /*vtbl*/ 6, /*#scodes*/ 0, /*flags*/ FUNCFLAG_FRESTRICTED,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_I4, -1, PARAMFLAG_FIN},
         {VT_PTR, -1, PARAMFLAG_FIN},
@@ -5852,6 +6039,7 @@ static const type_info info[] = {
       /*id*/ 0x1, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 7, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5864,6 +6052,7 @@ static const type_info info[] = {
       /*id*/ 0x2, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 8, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5876,6 +6065,7 @@ static const type_info info[] = {
       /*id*/ 0x3, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 9, /*#scodes*/ 0, /*flags*/ 0,
       {VT_VOID, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5888,6 +6078,7 @@ static const type_info info[] = {
       /*id*/ 0x4, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 10, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5900,6 +6091,7 @@ static const type_info info[] = {
       /*id*/ 0x5, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 11, /*#scodes*/ 0, /*flags*/ 0,
       {VT_INT, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5912,6 +6104,7 @@ static const type_info info[] = {
       /*id*/ 0x6, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 0, /*#opt*/ 0, /*vtbl*/ 12, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {-1, 0, 0}
       },
@@ -5924,6 +6117,7 @@ static const type_info info[] = {
       /*id*/ 0x7, /*func*/ FUNC_DISPATCH, /*inv*/ INVOKE_FUNC, /*call*/ CC_STDCALL,
       /*#param*/ 1, /*#opt*/ 0, /*vtbl*/ 13, /*#scodes*/ 0, /*flags*/ 0,
       {VT_R8, -1, PARAMFLAG_NONE}, /* ret */
+      /*#custdata*/ 0, {},
       { /* params */
         {VT_BSTR, -1, PARAMFLAG_FIN},
         {-1, 0, 0}
@@ -5962,11 +6156,18 @@ static const type_info info[] = {
       expect_hex(U(*(elem)).paramdesc.wParamFlags, (info)->wParamFlags); \
   }
 
+static void parse_guid(LPCSTR strGuid, GUID *guid)
+{
+    WCHAR guidW[39];
+    MultiByteToWideChar(CP_ACP, 0, strGuid, -1, guidW, ARRAY_SIZE(guidW));
+    ole_check(IIDFromString(guidW, guid));
+}
+
 static void test_dump_typelib(const WCHAR *name)
 {
     ITypeLib *typelib;
     CUSTDATA cust_data;
-    int iface = 0, func, var;
+    int iface = 0, func, var, cust;
     HREFTYPE hRefType = 0;
     VARIANT v;
     HRESULT hr;
@@ -6016,13 +6217,11 @@ static void test_dump_typelib(const WCHAR *name)
         /* compare type uuid */
         if (ti->uuid && *ti->uuid)
         {
-            WCHAR guidW[39];
             ITypeInfo *typeinfo2;
             HRESULT hr;
             GUID guid;
 
-            MultiByteToWideChar(CP_ACP, 0, ti->uuid, -1, guidW, ARRAY_SIZE(guidW));
-            IIDFromString(guidW, &guid);
+            parse_guid(ti->uuid,&guid);
             expect_guid(&guid, &typeattr->guid);
 
             /* check that it's possible to search using this uuid */
@@ -6032,9 +6231,26 @@ static void test_dump_typelib(const WCHAR *name)
             if (hr == S_OK) ITypeInfo_Release(typeinfo2);
         }
 
+        ole_check(ITypeInfo_GetTypeAttr(typeinfo, &typeattr));
+
         hr = ITypeInfo_QueryInterface(typeinfo, &IID_ITypeInfo2, (void**)&typeinfo2);
         ok(hr == S_OK, "Could not get ITypeInfo2: %08x\n", hr);
 
+        memset(&cust_data, 0, sizeof(cust_data));
+        ole_check(ITypeInfo2_GetAllCustData(typeinfo2,&cust_data));
+        expect_int(cust_data.cCustData, ti->cCustData);
+        ClearCustData(&cust_data);
+        for (cust = 0; cust < ti->cCustData; cust++)
+        {
+            GUID guid;
+            parse_guid(ti->custdata[cust].uuid,&guid);
+            /* check that it's possible to search using this uuid */
+            hr = ITypeInfo2_GetCustData(typeinfo2,&guid,&v);
+            ok(hr == S_OK, "GetCustDatafailed: %08x\n", hr);
+            check_variant_info(&v,&ti->custdata[cust].value);
+            VariantClear(&v);
+        }
+
         for (func = 0; func < typeattr->cFuncs; func++)
         {
             const function_info *fn_info = &ti->funcs[func];
@@ -6054,6 +6270,22 @@ static void test_dump_typelib(const WCHAR *name)
             expect_int(desc->oVft, fn_info->vtbl_index * sizeof(void*));
             expect_int(desc->cScodes, fn_info->cScodes);
             expect_int(desc->wFuncFlags, fn_info->wFuncFlags);
+
+            memset(&cust_data, 0, sizeof(cust_data));
+            ole_check(ITypeInfo2_GetAllFuncCustData(typeinfo2,func,&cust_data));
+            expect_int(cust_data.cCustData, fn_info->cCustData);
+            ClearCustData(&cust_data);
+            for (cust = 0; cust < fn_info->cCustData; cust++)
+            {
+                GUID guid;
+                parse_guid(fn_info->custdata[cust].uuid,&guid);
+                /* check that it's possible to search using this uuid */
+                hr = ITypeInfo2_GetFuncCustData(typeinfo2,func,&guid,&v);
+                ok(hr == S_OK, "GetCustDatafailed: %08x\n", hr);
+                check_variant_info(&v,&fn_info->custdata[cust].value);
+                VariantClear(&v);
+            }
+
             ole_check(ITypeInfo_GetNames(typeinfo, desc->memid, namesTab, 256, &cNames));
             for (i = 0; i < cNames; i++)
             {
@@ -6067,6 +6299,21 @@ static void test_dump_typelib(const WCHAR *name)
             {
                 check_type(&desc->lprgelemdescParam[i], &fn_info->params[i]);
 
+                memset(&cust_data, 0, sizeof(cust_data));
+                ole_check(ITypeInfo2_GetAllParamCustData(typeinfo2,func,i,&cust_data));
+                expect_int(cust_data.cCustData, fn_info->params[i].cCustData);
+                ClearCustData(&cust_data);
+                for (cust = 0; cust < fn_info->params[i].cCustData; cust++)
+                {
+                    GUID guid;
+                    parse_guid(fn_info->params[i].custdata[cust].uuid,&guid);
+                    /* check that it's possible to search using this uuid */
+                    hr = ITypeInfo2_GetParamCustData(typeinfo2,func,i,&guid,&v);
+                    ok(hr == S_OK, "GetParamCustDatafailed: %08x\n", hr);
+                    check_variant_info(&v,&fn_info->params[i].custdata[cust].value);
+                    VariantClear(&v);
+                }
+
                 if (desc->lprgelemdescParam[i].tdesc.vt == VT_USERDEFINED)
                 {
                     ITypeInfo *param;
@@ -6096,9 +6343,7 @@ static void test_dump_typelib(const WCHAR *name)
             VariantClear(&v);
 
             memset(&cust_data, 0, sizeof(cust_data));
-            hr = ITypeInfo2_GetAllCustData(typeinfo2, &cust_data);
             ITypeInfo_ReleaseFuncDesc(typeinfo, desc);
-            ClearCustData(&cust_data);
         }
 
         for (var = 0; var < typeattr->cVars; var++)
@@ -6132,6 +6377,20 @@ static void test_dump_typelib(const WCHAR *name)
             } else {
                 expect_null(desc->DUMMYUNIONNAME.lpvarValue);
             }
+            memset(&cust_data, 0, sizeof(cust_data));
+            ole_check(ITypeInfo2_GetAllVarCustData(typeinfo2,var,&cust_data));
+            expect_int(cust_data.cCustData, var_info->cCustData);
+            ClearCustData(&cust_data);
+            for (cust = 0; cust < var_info->cCustData; cust++)
+            {
+                GUID guid;
+                parse_guid(var_info->custdata[cust].uuid,&guid);
+                /* check that it's possible to search using this uuid */
+                hr = ITypeInfo2_GetVarCustData(typeinfo2,var,&guid,&v);
+                ok(hr == S_OK, "GetVarCustData failed: %08x\n", hr);
+                check_variant_info(&v,&var_info->custdata[cust].value);
+                VariantClear(&v);
+            }
 
             check_type(&desc->elemdescVar, &var_info->elemdescVar);
 



More information about the wine-devel mailing list