diff --git a/dlls/user.exe16/user.c b/dlls/user.exe16/user.c index 5063f9d2343..29a975a28ba 100644 --- a/dlls/user.exe16/user.c +++ b/dlls/user.exe16/user.c @@ -1478,6 +1478,53 @@ static LPCSTR parse_menu_resource( LPCSTR res, HMENU hMenu, BOOL oldFormat ) return res; } +static LPCSTR parse_menuex_resource( LPCSTR res, HMENU hMenu ) +{ + BYTE resinfo; + do { + MENUITEMINFOA mii; + + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STATE | MIIM_ID | MIIM_TYPE; + mii.fType = GET_DWORD(res); + res += sizeof(DWORD); + mii.fState = GET_DWORD(res); + res += sizeof(DWORD); + mii.wID = GET_WORD(res); + res += sizeof(WORD); + resinfo = GET_BYTE(res); + res += sizeof(BYTE); + mii.dwTypeData = (LPSTR) res; + res += 1 + strlen(mii.dwTypeData); + + TRACE("Menu item: [%08x,%08x,%04x,%04x,%s]\n", + mii.fType, mii.fState, mii.wID, resinfo, debugstr_a(mii.dwTypeData)); + + if (resinfo & 1) + { + /* DWORD helpid = GET_DWORD(res); FIXME: use this. */ + res += sizeof(DWORD); + mii.hSubMenu = CreatePopupMenu(); + if (!mii.hSubMenu) + return NULL; + if (!(res = parse_menuex_resource(res, mii.hSubMenu))) { + DestroyMenu(mii.hSubMenu); + return NULL; + } + mii.fMask |= MIIM_SUBMENU; + mii.fType |= MF_POPUP; + } + else if(!*mii.dwTypeData && !(mii.fType & MF_SEPARATOR)) + { + WARN("Converting NULL menu item %04x, type %04x to SEPARATOR\n", + mii.wID, mii.fType); + mii.fType |= MF_SEPARATOR; + } + InsertMenuItemA(hMenu, -1, MF_BYPOSITION, &mii); + } while (!(resinfo & MF_END)); + return res; +} + /********************************************************************** * LoadMenuIndirect (USER.220) */ @@ -1485,8 +1532,9 @@ HMENU16 WINAPI LoadMenuIndirect16( LPCVOID template ) { BOOL oldFormat; HMENU hMenu; - WORD version, offset; + WORD version = 0, offset; LPCSTR p = template; + LPCSTR ret = NULL; TRACE("(%p)\n", template ); @@ -1498,17 +1546,18 @@ HMENU16 WINAPI LoadMenuIndirect16( LPCVOID template ) { version = GET_WORD(p); p += sizeof(WORD); - if (version) - { - WARN("version must be 0 for Win16 >= 3.00 applications\n" ); - return 0; - } offset = GET_WORD(p); p += sizeof(WORD) + offset; } if (!(hMenu = CreateMenu())) return 0; - if (!parse_menu_resource( p, hMenu, oldFormat )) + if (version == 0) + ret = parse_menu_resource( p, hMenu, oldFormat ); + else if (version == 1) + ret = parse_menuex_resource( p, hMenu ); + else + FIXME("invalid version %d for Win16 application\n", version); + if (!ret) { DestroyMenu( hMenu ); return 0;