[PATCH v3 11/13] widl: Allow adding the same custdata GUID multiple times in a typelib.

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


e.g. using the same kind of custdata in multiple interfaces

Signed-off-by: Kevin Puetz <PuetzKevinA at JohnDeere.com>
---
 tools/widl/write_msft.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index 4fc5d46050..5cf6389149 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -1263,18 +1263,25 @@ static void write_default_value(msft_typelib_t *typelib, type_t *type, expr_t *e
 static HRESULT set_custdata(msft_typelib_t *typelib, REFGUID guid,
                             int vt, const void *value, int *offset)
 {
-    MSFT_GuidEntry guidentry;
     int guidoffset;
     int custoffset;
     int *custdata;
     int data_out;
+    int hash_key;
 
-    guidentry.guid = *guid;
+    hash_key = ctl2_hash_guid(guid);
+    guidoffset = ctl2_find_guid(typelib, hash_key, guid);
+    if(guidoffset == -1) {
+        /* add GUID that was not already present */
+        MSFT_GuidEntry guidentry;
+        guidentry.guid = *guid;
 
-    guidentry.hreftype = -1;
-    guidentry.next_hash = -1;
+        guidentry.hreftype = -1;
+        guidentry.next_hash = -1;
+
+        guidoffset = ctl2_alloc_guid(typelib, &guidentry);
+    }
 
-    guidoffset = ctl2_alloc_guid(typelib, &guidentry);
     if(vt == VT_BSTR)
         /* TODO midl appears to share a single reference if the same string is used as custdata in multiple places */
         write_string_value(typelib, &data_out, value);



More information about the wine-devel mailing list