[PATCH v3 07/13] oleaut32/tests: Cover Get*CustData in test_dump_typelib.

Kevin Puetz PuetzKevinA at JohnDeere.com
Fri Aug 7 15:36:36 CDT 2020


Signed-off-by: Kevin Puetz <PuetzKevinA at JohnDeere.com>
---
 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 01fbffe5ca..9ebb14768f 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"
@@ -4370,7 +4378,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));
 
@@ -4381,6 +4392,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)
         {
@@ -4391,6 +4409,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),
@@ -4399,12 +4418,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");
@@ -4431,6 +4468,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"
@@ -4444,6 +4482,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");
@@ -4462,6 +4508,7 @@ static void test_dump_typelib(const WCHAR *name)
         }
 
         ITypeInfo_ReleaseTypeAttr(info, attr);
+        ITypeInfo2_Release(info2);
         ITypeInfo_Release(info);
         SysFreeString(name);
     }
@@ -4480,11 +4527,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
@@ -4499,6 +4553,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;
@@ -4513,6 +4569,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;
 
@@ -4529,6 +4587,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;
@@ -4541,11 +4601,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 */
     },
   },
@@ -4555,11 +4617,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}
@@ -4578,11 +4642,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}
@@ -4601,11 +4667,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}
       },
@@ -4622,11 +4690,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 */
     },
   },
@@ -4636,6 +4706,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 */ },
 },
@@ -4644,6 +4715,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 */ },
 },
@@ -4652,11 +4724,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 */
     },
   },
@@ -4666,6 +4740,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 */ },
 },
@@ -4674,6 +4749,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 */ },
 },
@@ -4682,11 +4758,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},
@@ -4703,6 +4781,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}
       },
@@ -4715,6 +4794,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}
       },
@@ -4727,6 +4807,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}
@@ -4741,6 +4822,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},
@@ -4759,6 +4841,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},
@@ -4781,6 +4864,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},
@@ -4809,6 +4893,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}
       },
@@ -4825,11 +4910,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}
       },
@@ -4846,11 +4933,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}
       },
@@ -4867,26 +4956,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 */
     },
   },
@@ -4896,26 +4990,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 */
     },
   },
@@ -4925,6 +5024,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 */ },
 },
@@ -4933,6 +5033,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 */ },
 },
@@ -4941,16 +5042,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 */
     },
   },
@@ -4960,16 +5064,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 */
     },
   },
@@ -4979,16 +5086,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 */
     },
   },
@@ -4998,16 +5108,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 */
     },
   },
@@ -5017,6 +5130,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 */ },
 },
@@ -5025,16 +5139,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 */
     },
   },
@@ -5044,16 +5161,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 */
     },
   },
@@ -5063,6 +5183,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 */ },
 },
@@ -5071,16 +5192,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 */
     },
   },
@@ -5090,16 +5214,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 */
     },
   },
@@ -5109,6 +5236,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 */ },
 },
@@ -5117,11 +5245,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 */
     },
   },
@@ -5131,11 +5261,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 */
     },
   },
@@ -5145,6 +5277,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 */ },
 },
@@ -5153,16 +5286,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 */
     },
   },
@@ -5172,16 +5308,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 */
     },
   },
@@ -5191,11 +5330,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}
@@ -5210,6 +5351,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}
@@ -5224,6 +5366,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}
@@ -5238,6 +5381,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}
@@ -5252,6 +5396,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}
@@ -5266,6 +5411,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}
@@ -5284,11 +5430,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}
       },
@@ -5301,6 +5449,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}
@@ -5315,6 +5464,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}
       },
@@ -5327,6 +5477,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}
@@ -5341,6 +5492,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}
       },
@@ -5353,6 +5505,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}
@@ -5367,6 +5520,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},
@@ -5384,11 +5538,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 */
     },
   },
@@ -5398,11 +5554,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},
@@ -5419,6 +5577,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}
       },
@@ -5431,6 +5590,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}
       },
@@ -5443,6 +5603,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}
@@ -5457,6 +5618,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},
@@ -5475,6 +5637,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},
@@ -5497,6 +5660,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},
@@ -5525,6 +5689,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}
       },
@@ -5537,6 +5702,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}
       },
@@ -5549,6 +5715,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}
       },
@@ -5561,6 +5728,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}
       },
@@ -5573,6 +5741,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}
       },
@@ -5585,6 +5754,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}
       },
@@ -5597,6 +5767,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}
@@ -5615,11 +5786,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}
       },
@@ -5632,6 +5805,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}
@@ -5646,6 +5820,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}
       },
@@ -5658,6 +5833,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}
@@ -5672,6 +5848,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}
       },
@@ -5684,6 +5861,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}
@@ -5698,6 +5876,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},
@@ -5720,11 +5899,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},
@@ -5741,6 +5922,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}
       },
@@ -5753,6 +5935,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}
       },
@@ -5765,6 +5948,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}
@@ -5779,6 +5963,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},
@@ -5797,6 +5982,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},
@@ -5819,6 +6005,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},
@@ -5847,6 +6034,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}
       },
@@ -5859,6 +6047,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}
       },
@@ -5871,6 +6060,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}
       },
@@ -5883,6 +6073,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}
       },
@@ -5895,6 +6086,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}
       },
@@ -5907,6 +6099,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}
       },
@@ -5919,6 +6112,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}
@@ -5957,11 +6151,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;
@@ -6009,13 +6210,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 */
@@ -6025,9 +6224,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];
@@ -6047,6 +6263,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++)
             {
@@ -6060,6 +6292,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;
@@ -6089,9 +6336,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++)
@@ -6125,6 +6370,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