diff --git a/tools/widl/parser.y b/tools/widl/parser.y index bce194c1343..99be1f2c313 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -493,6 +493,7 @@ attribute: { $$ = NULL; } | tIN { $$ = make_attr(ATTR_IN); } | tINPUTSYNC { $$ = make_attr(ATTR_INPUTSYNC); } | tLENGTHIS '(' m_exprs ')' { $$ = make_attrp(ATTR_LENGTHIS, $3); } + | tLCID '(' expr_const ')' { $$ = make_attrp(ATTR_LIBLCID, $3); } | tLOCAL { $$ = make_attr(ATTR_LOCAL); } | tNONBROWSABLE { $$ = make_attr(ATTR_NONBROWSABLE); } | tNONCREATABLE { $$ = make_attr(ATTR_NONCREATABLE); } @@ -2010,6 +2011,7 @@ struct allowed_attr allowed_attr[] = /* ATTR_IN */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "in" }, /* ATTR_INPUTSYNC */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "inputsync" }, /* ATTR_LENGTHIS */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, "length_is" }, + /* ATTR_LIBLCID */ { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "lcid" }, /* ATTR_LOCAL */ { 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, "local" }, /* ATTR_NONBROWSABLE */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "nonbrowsable" }, /* ATTR_NONCREATABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "noncreatable" }, diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index fd8b8dd1904..bf28a0109a0 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -104,6 +104,7 @@ enum attr_type ATTR_IN, ATTR_INPUTSYNC, ATTR_LENGTHIS, + ATTR_LIBLCID, ATTR_LOCAL, ATTR_NONBROWSABLE, ATTR_NONCREATABLE, diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index 56bff46bf28..accb648980c 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -2322,8 +2322,8 @@ static void set_help_string_context(msft_typelib_t *typelib) static void set_lcid(msft_typelib_t *typelib) { - typelib->typelib_header.lcid2 = 0x0; - return; + const expr_t *lcid_expr = get_attrp( typelib->typelib->attrs, ATTR_LIBLCID ); + typelib->typelib_header.lcid2 = lcid_expr ? lcid_expr->cval : 0x0; } static void set_lib_flags(msft_typelib_t *typelib)