Alexandre Julliard : widl: Improve registration of coclasses contained in typelibs.

Alexandre Julliard julliard at winehq.org
Wed Dec 8 10:56:25 CST 2010


Module: wine
Branch: master
Commit: 2dc85894a73544e834ddef01d4c45bbc91c4fd1f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2dc85894a73544e834ddef01d4c45bbc91c4fd1f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Dec  8 14:54:08 2010 +0100

widl: Improve registration of coclasses contained in typelibs.

---

 tools/widl/register.c |   23 ++++++++++++++---------
 1 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/tools/widl/register.c b/tools/widl/register.c
index e3d3875..736ec2c 100644
--- a/tools/widl/register.c
+++ b/tools/widl/register.c
@@ -90,15 +90,13 @@ static int write_interfaces( const statement_list_t *stmts )
 
     if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, const statement_t, entry )
     {
-        if (stmt->type == STMT_LIBRARY)
-            count += write_interfaces( stmt->u.lib->stmts );
-        else if (stmt->type == STMT_TYPE && type_get_type( stmt->u.type ) == TYPE_INTERFACE)
+        if (stmt->type == STMT_TYPE && type_get_type( stmt->u.type ) == TYPE_INTERFACE)
             count += write_interface( stmt->u.type );
     }
     return count;
 }
 
-static int write_coclass( const type_t *class )
+static int write_coclass( const type_t *class, const typelib_t *typelib )
 {
     const UUID *uuid = get_attrp( class->attrs, ATTR_UUID );
     const char *descr = get_attrp( class->attrs, ATTR_HELPSTRING );
@@ -107,20 +105,27 @@ static int write_coclass( const type_t *class )
     const char *threading = get_coclass_threading( class );
 
     if (!uuid) return 0;
+    if (typelib && !threading) return 0;
     if (!descr) descr = class->name;
 
     put_str( indent, "ForceRemove '%s' = s '%s'\n", format_uuid( uuid ), descr );
     put_str( indent++, "{\n" );
     if (threading) put_str( indent, "InprocServer32 = s '%%MODULE%%' { val ThreadingModel = s '%s' }\n",
                             threading );
-    if (progid || vi_progid) put_str( indent, "CLSID = s '%s'\n", descr );
     if (progid) put_str( indent, "ProgId = s '%s'\n", progid );
+    if (typelib)
+    {
+        const UUID *typelib_uuid = get_attrp( typelib->attrs, ATTR_UUID );
+        const unsigned int version = get_attrv( typelib->attrs, ATTR_VERSION );
+        put_str( indent, "TypeLib = s '%s'\n", format_uuid( typelib_uuid ));
+        put_str( indent, "Version = s '%u.%u'\n", MAJORVERSION(version), MINORVERSION(version) );
+    }
     if (vi_progid) put_str( indent, "VersionIndependentProgId = s '%s'\n", vi_progid );
     put_str( --indent, "}\n" );
     return 1;
 }
 
-static void write_coclasses( const statement_list_t *stmts, const UUID *typelib_uuid )
+static void write_coclasses( const statement_list_t *stmts, const typelib_t *typelib )
 {
     const statement_t *stmt;
 
@@ -129,12 +134,12 @@ static void write_coclasses( const statement_list_t *stmts, const UUID *typelib_
         if (stmt->type == STMT_TYPE)
         {
             const type_t *type = stmt->u.type;
-            if (type_get_type(type) == TYPE_COCLASS) write_coclass( type );
+            if (type_get_type(type) == TYPE_COCLASS) write_coclass( type, typelib );
         }
         else if (stmt->type == STMT_LIBRARY)
         {
-            const UUID *uuid = get_attrp( stmt->u.lib->attrs, ATTR_UUID );
-            write_coclasses( stmt->u.lib->stmts, uuid );
+            const typelib_t *lib = stmt->u.lib;
+            write_coclasses( lib->stmts, lib );
         }
     }
 }




More information about the wine-cvs mailing list