"Ann & Jason Edmeades" us@edmeades.me.uk wrote:
Copy and store the dwTypeData of a menu item even for a ownerdraw item, and ensure the memory allocations/freeing occurs correctly
- /* Just change ftype to string and see what text is stored */
- memset(&info, 0x00, sizeof(info));
- info.cbSize= sizeof(MENUITEMINFO);
- info.fMask= MIIM_FTYPE; /* Set string type */
- info.fType= MFT_STRING;
- info.dwTypeData= (char *)0xdeadbeef;
- SetMenuItemInfo( hmenu, 0, TRUE, &info );
- /* Did we keep the old dwTypeData? */
- ok (GetMenuString( hmenu, 0, strback, 99, MF_BYPOSITION), "GetMenuString on ownerdraw entry failed\n");
- ok (!strcmp( strback, "Dummy string" ), "Menu text from Ansi version incorrect\n");
- /* Just change ftype to bitmap and back to ensure data isnt freed */
- memset(&info, 0x00, sizeof(info));
- info.cbSize= sizeof(MENUITEMINFO);
- info.fMask= MIIM_FTYPE; /* Set as bitmap type */
- info.fType= MFT_BITMAP;
- info.dwTypeData= (char *)0xdeadbee2;
- SetMenuItemInfo( hmenu, 0, TRUE, &info );
- info.fType= MFT_OWNERDRAW; /* Set as ownerdraw type */
- info.dwTypeData= (char *)0xdeadbee3;
- SetMenuItemInfo( hmenu, 0, TRUE, &info );
You don't check SetMenuItemInfo return code after the above calls and I very much suspect that they fail leading to the observed results.