Signed-off-by: Zebediah Figura z.figura12@gmail.com --- tools/widl/write_msft.c | 71 ++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 30 deletions(-)
diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index 4b09317..1b05159 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -990,40 +990,51 @@ static int encode_type(
case VT_USERDEFINED: { + importinfo_t *importinfo; int typeinfo_offset;
- /* typedef'd types without public attribute aren't included in the typelib */ - while (type->typelib_idx < 0 && type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC)) - type = type_alias_get_aliasee(type); - - chat("encode_type: VT_USERDEFINED - type %p name = %s real type %d idx %d\n", type, - type->name, type_get_type(type), type->typelib_idx); - - if(type->typelib_idx == -1) { - chat("encode_type: trying to ref not added type\n"); - switch (type_get_type(type)) { - case TYPE_STRUCT: - add_structure_typeinfo(typelib, type); - break; - case TYPE_INTERFACE: - add_interface_typeinfo(typelib, type); - break; - case TYPE_ENUM: - add_enum_typeinfo(typelib, type); - break; - case TYPE_UNION: - add_union_typeinfo(typelib, type); - break; - case TYPE_COCLASS: - add_coclass_typeinfo(typelib, type); - break; - default: - error("encode_type: VT_USERDEFINED - unhandled type %d\n", - type_get_type(type)); - } + if ((importinfo = find_importinfo(typelib, type->name))) + { + chat("encode_type: VT_USERDEFINED - found imported type %s in %s\n", + type->name, importinfo->importlib->name); + alloc_importinfo(typelib, importinfo); + typeinfo_offset = importinfo->offset | 0x1; } + else + { + /* typedef'd types without public attribute aren't included in the typelib */ + while (type->typelib_idx < 0 && type_is_alias(type) && !is_attr(type->attrs, ATTR_PUBLIC)) + type = type_alias_get_aliasee(type);
- typeinfo_offset = typelib->typelib_typeinfo_offsets[type->typelib_idx]; + chat("encode_type: VT_USERDEFINED - type %p name = %s real type %d idx %d\n", type, + type->name, type_get_type(type), type->typelib_idx); + + if(type->typelib_idx == -1) { + chat("encode_type: trying to ref not added type\n"); + switch (type_get_type(type)) { + case TYPE_STRUCT: + add_structure_typeinfo(typelib, type); + break; + case TYPE_INTERFACE: + add_interface_typeinfo(typelib, type); + break; + case TYPE_ENUM: + add_enum_typeinfo(typelib, type); + break; + case TYPE_UNION: + add_union_typeinfo(typelib, type); + break; + case TYPE_COCLASS: + add_coclass_typeinfo(typelib, type); + break; + default: + error("encode_type: VT_USERDEFINED - unhandled type %d\n", + type_get_type(type)); + } + } + + typeinfo_offset = typelib->typelib_typeinfo_offsets[type->typelib_idx]; + } for (typeoffset = 0; typeoffset < typelib->typelib_segdir[MSFT_SEG_TYPEDESC].length; typeoffset += 8) { typedata = (void *)&typelib->typelib_segment_data[MSFT_SEG_TYPEDESC][typeoffset]; if ((typedata[0] == ((0x7fff << 16) | VT_USERDEFINED)) && (typedata[1] == typeinfo_offset)) break;