Alexandre Julliard : widl: Add support for writing 64-bit format typelibs.

Alexandre Julliard julliard at winehq.org
Thu May 21 09:35:50 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 21 11:10:22 2009 +0200

widl: Add support for writing 64-bit format typelibs.

---

 tools/widl/hash.c       |    1 +
 tools/widl/hash.h       |    6 ------
 tools/widl/widl.c       |    1 +
 tools/widl/widltypes.h  |    8 ++++++++
 tools/widl/write_msft.c |   10 ++++++----
 5 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/tools/widl/hash.c b/tools/widl/hash.c
index e09848e..bd20995 100644
--- a/tools/widl/hash.c
+++ b/tools/widl/hash.c
@@ -25,6 +25,7 @@
 #include "winbase.h"
 #include "winnls.h"
 
+#include "widltypes.h"
 #include "hash.h"
 
 static const unsigned char Lookup_16[128 * 3] = {
diff --git a/tools/widl/hash.h b/tools/widl/hash.h
index d859eae..3c2fd29 100644
--- a/tools/widl/hash.h
+++ b/tools/widl/hash.h
@@ -22,12 +22,6 @@
 #ifndef __WIDL_HASH_H
 #define __WIDL_HASH_H
 
-typedef enum tag_syskind_t {
-    SYS_WIN16 = 0,
-    SYS_WIN32,
-    SYS_MAC
-} syskind_t;
-
 extern unsigned int lhash_val_of_name_sys( syskind_t skind, LCID lcid, LPCSTR lpStr);
 
 #endif
diff --git a/tools/widl/widl.c b/tools/widl/widl.c
index cbc35b7..6ae8bae 100644
--- a/tools/widl/widl.c
+++ b/tools/widl/widl.c
@@ -135,6 +135,7 @@ FILE *header;
 FILE *idfile;
 
 size_t pointer_size = 0;
+syskind_t typelib_kind = sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32;
 
 time_t now;
 
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 7a194f4..f5466bf 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -487,6 +487,14 @@ struct _statement_t {
     } u;
 };
 
+typedef enum {
+    SYS_WIN16,
+    SYS_WIN32,
+    SYS_MAC,
+    SYS_WIN64
+} syskind_t;
+
+extern syskind_t typelib_kind;
 extern user_type_list_t user_type_list;
 void check_for_additional_prototype_types(const var_list_t *list);
 
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c
index 3506efe..bff61fd 100644
--- a/tools/widl/write_msft.c
+++ b/tools/widl/write_msft.c
@@ -45,7 +45,7 @@
 #include "winbase.h"
 #include "winnls.h"
 
-#include "widltypes.h"
+#include "widl.h"
 #include "typelib.h"
 #include "typelib_struct.h"
 #include "utils.h"
@@ -1543,7 +1543,7 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index)
 
     /* adjust size of VTBL */
     if(funckind != 0x3 /* FUNC_STATIC */)
-        typeinfo->typeinfo->cbSizeVft += 4;
+        typeinfo->typeinfo->cbSizeVft += pointer_size;
 
     /* Increment the number of function elements */
     typeinfo->typeinfo->cElement += 1;
@@ -2031,7 +2031,7 @@ static void add_interface_typeinfo(msft_typelib_t *typelib, type_t *interface)
         }
     }
     msft_typeinfo->typeinfo->datatype2 = num_funcs << 16 | num_parents;
-    msft_typeinfo->typeinfo->cbSizeVft = num_funcs * 4;
+    msft_typeinfo->typeinfo->cbSizeVft = num_funcs * pointer_size;
 
     STATEMENTS_FOR_EACH_FUNC( stmt_func, type_iface_get_stmts(interface) ) {
         var_t *func = stmt_func->u.var;
@@ -2539,6 +2539,8 @@ int create_msft_typelib(typelib_t *typelib)
     GUID midl_time_guid    = {0xde77ba63,0x517c,0x11d1,{0xa2,0xda,0x00,0x00,0xf8,0x77,0x3c,0xe9}}; 
     GUID midl_version_guid = {0xde77ba64,0x517c,0x11d1,{0xa2,0xda,0x00,0x00,0xf8,0x77,0x3c,0xe9}}; 
 
+    pointer_size = (typelib_kind == SYS_WIN64) ? 8 : 4;
+
     msft = xmalloc(sizeof(*msft));
     memset(msft, 0, sizeof(*msft));
     msft->typelib = typelib;
@@ -2546,7 +2548,7 @@ int create_msft_typelib(typelib_t *typelib)
     ctl2_init_header(msft);
     ctl2_init_segdir(msft);
 
-    msft->typelib_header.varflags |= SYS_WIN32;
+    msft->typelib_header.varflags |= typelib_kind;
 
     /*
      * The following two calls return an offset or -1 if out of memory. We




More information about the wine-cvs mailing list