[PATCH v2 4/6] user32: Reimplement GetMenuStringA on top of NtUserThunkedMenuItemInfo.

Jacek Caban wine at gitlab.winehq.org
Tue Jun 21 08:10:01 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 dlls/user32/menu.c | 45 ++++++++++++---------------------------------
 1 file changed, 12 insertions(+), 33 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index df260b063d9..29a266d2312 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -476,42 +476,21 @@ BOOL WINAPI ChangeMenuW( HMENU hMenu, UINT pos, LPCWSTR data,
 /*******************************************************************
  *         GetMenuStringA    (USER32.@)
  */
-INT WINAPI GetMenuStringA(
-	HMENU hMenu,	/* [in] menuhandle */
-	UINT wItemID,	/* [in] menu item (dep. on wFlags) */
-	LPSTR str,	/* [out] outbuffer. If NULL, func returns entry length*/
-	INT nMaxSiz,	/* [in] length of buffer. if 0, func returns entry len*/
-	UINT wFlags	/* [in] MF_ flags */
-)
+INT WINAPI GetMenuStringA( HMENU menu, UINT item, char *str, INT count, UINT flags )
 {
-    POPUPMENU *menu;
-    MENUITEM *item;
-    UINT pos;
-    INT ret;
-
-    TRACE("menu=%p item=%04x ptr=%p len=%d flags=%04x\n", hMenu, wItemID, str, nMaxSiz, wFlags );
-    if (str && nMaxSiz) str[0] = '\0';
-
-    if (!(menu = find_menu_item(hMenu, wItemID, wFlags, &pos)))
-    {
-        SetLastError( ERROR_MENU_ITEM_NOT_FOUND);
-        return 0;
-    }
-    item = &menu->items[pos];
+    MENUITEMINFOA info;
+    int ret;
 
-    if (!item->text)
-        ret = 0;
-    else if (!str || !nMaxSiz)
-        ret = WideCharToMultiByte( CP_ACP, 0, item->text, -1, NULL, 0, NULL, NULL );
-    else
-    {
-        if (!WideCharToMultiByte( CP_ACP, 0, item->text, -1, str, nMaxSiz, NULL, NULL ))
-            str[nMaxSiz-1] = 0;
-        ret = strlen(str);
-    }
-    release_menu_ptr(menu);
+    TRACE( "menu=%p item=%04x ptr=%p len=%d flags=%04x\n", menu, item, str, count, flags );
 
-    TRACE("returning %s\n", debugstr_a(str));
+    info.cbSize = sizeof(info);
+    info.fMask = MIIM_STRING;
+    info.dwTypeData = str;
+    info.cch = count;
+    ret = NtUserThunkedMenuItemInfo( menu, item, flags, NtUserGetMenuItemInfoA,
+                                     (MENUITEMINFOW *)&info, NULL );
+    if (ret) ret = info.cch;
+    TRACE( "returning %s %d\n", debugstr_a( str ), ret );
     return ret;
 }
 
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/294



More information about the wine-devel mailing list