Robert Shearman : widl: Write out TYPEFLAG_FDUAL, TYPEFLAG_FDISPATCHABLE and

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 9 05:47:31 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 649d5d0e8e8b7aab4f03f427328c80e7a5497b1f
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=649d5d0e8e8b7aab4f03f427328c80e7a5497b1f

Author: Robert Shearman <rob at codeweavers.com>
Date:   Thu Feb  9 12:09:44 2006 +0100

widl: Write out TYPEFLAG_FDUAL, TYPEFLAG_FDISPATCHABLE and
TYPEFLAG_FOLEAUTOMATION typelib flags.

---

 tools/widl/write_msft.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index ac67500..f749542 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -1676,6 +1676,11 @@ static msft_typeinfo_t *create_msft_type
             typeinfo->datatype1 = offset;
             break;
           }
+
+        case ATTR_DUAL:
+            typeinfo->flags |= 0x40; /* TYPEFLAG_FDUAL */
+            break;
+
         case ATTR_HELPCONTEXT:
           {
             expr_t *expr = (expr_t*)attr->u.pval;
@@ -1706,6 +1711,10 @@ static msft_typeinfo_t *create_msft_type
         case ATTR_ODL:
             break;
 
+        case ATTR_OLEAUTOMATION:
+            typeinfo->flags |= 0x100; /* TYPEFLAG_FOLEAUTOMATION */
+            break;
+
         case ATTR_PUBLIC:
             break;
 
@@ -1824,6 +1833,7 @@ static void add_interface_typeinfo(msft_
     msft_typeinfo_t *msft_typeinfo;
     int num_parents = 0, num_funcs = 0;
     const attr_t *attr;
+    const type_t *derived;
 
     for(attr = interface->attrs; attr; attr = NEXT_LINK(attr))
         if(attr->type == ATTR_DISPINTERFACE)
@@ -1841,6 +1851,14 @@ static void add_interface_typeinfo(msft_
     msft_typeinfo->typeinfo->size = 4;
     msft_typeinfo->typeinfo->typekind |= 0x2200;
 
+    for (derived = interface->ref; derived; derived = derived->ref)
+        if (derived->name && !strcmp(derived->name, "IDispatch"))
+            msft_typeinfo->typeinfo->flags |= 0x1000; /* TYPEFLAG_FDISPATCHABLE */
+
+    /* can't be dual if it doesn't derive from IDispatch */
+    if (!(msft_typeinfo->typeinfo->flags & 0x1000)) /* TYPEFLAG_FDISPATCHABLE */
+        msft_typeinfo->typeinfo->flags &= 0x40; /* TYPEFLAG_FDUAL */
+
     if(interface->ref)
         add_impl_type(msft_typeinfo, interface->ref);
 




More information about the wine-cvs mailing list