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