Revalidate menu handle in mt.hTopMenu after DispatchMessage.

diff --git a/controls/menu.c b/controls/menu.c
index 9791704..afade7e 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -2907,24 +2907,31 @@
 
     ReleaseCapture();
 
-    menu = MENU_GetMenu( mt.hTopMenu );
-
-    if( IsWindow( mt.hOwnerWnd ) )
+    /* If dropdown is still painted and the close box is clicked on
+       then the menu will be destroyed as part of the DispatchMessage above.
+       This will then invalidate the menu handle in mt.hTopMenu. We should
+       check for this first.  */
+    if( IsMenu( mt.hTopMenu ) )
     {
-	MENU_HideSubPopups( mt.hOwnerWnd, mt.hTopMenu, FALSE );
+	menu = MENU_GetMenu( mt.hTopMenu );
 
-	if (menu && menu->wFlags & MF_POPUP) 
-	{
-	    ShowWindow( menu->hWnd, SW_HIDE );
-	    uSubPWndLevel = 0;
-	}
-	MENU_SelectItem( mt.hOwnerWnd, mt.hTopMenu, NO_SELECTED_ITEM, FALSE, 0 );
-	SendMessageA( mt.hOwnerWnd, WM_MENUSELECT, MAKELONG(0,0xffff), 0 );
+        if( IsWindow( mt.hOwnerWnd ) )
+        {
+	    MENU_HideSubPopups( mt.hOwnerWnd, mt.hTopMenu, FALSE );
+
+	    if (menu && menu->wFlags & MF_POPUP) 
+	    {
+	        ShowWindow( menu->hWnd, SW_HIDE );
+	        uSubPWndLevel = 0;
+	    }
+	    MENU_SelectItem( mt.hOwnerWnd, mt.hTopMenu, NO_SELECTED_ITEM, FALSE, 0 );
+	    SendMessageA( mt.hOwnerWnd, WM_MENUSELECT, MAKELONG(0,0xffff), 0 );
+        }
+
+        /* Reset the variable for hiding menu */
+        if( menu ) menu->bTimeToHide = FALSE;
     }
 
-    /* Reset the variable for hiding menu */
-    menu->bTimeToHide = FALSE;
-    
     /* The return value is only used by TrackPopupMenu */
     return ((executedMenuId != -1) ? executedMenuId : 0);
 }